&&명령 사이 에 연산자를 사용하면 각 명령이 순서대로 실행되며 명령이 실패하면 (즉, 0이 아닌 상태를 반환) 후속 명령이 실행되지 않습니다.
무슨 일이 있어도 계속 가고 싶다면 ;대신 (또는 줄 바꿈)을 사용하십시오 &&. 여기서 하나의 명령을 실행해야하며 성공하면 명령의 성공 여부에 관계없이 몇 가지 명령을 더 실행하십시오. 이를 달성하는 한 가지 방법은 이러한 명령을 중괄호 그룹에 넣는 cd … && mount1; mount2것입니다 ( 우선 순위로 인해 성공 mount2했는지 여부를 실행하기 때문에 작동 하지 않습니다 cd).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
또는 스크립트를 종료하거나 cd실패하면 함수에서 돌아옵니다 .
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
또는에서 실행되고 실패 할 수있는 명령 뒤에 set -e넣습니다 || true(“또는 계속 진행”).
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
또는 성공해야하는 명령을 작성하십시오. test if /proc등이 이미 마운트되어 있는지 확인하십시오 .
mount_if_needed () {
eval "mount_point=${\$#}"
awk -v target="$mount_point" '$2 == target {exit(0)} END {exit(1)}' </proc/mounts ||
mount "$@"
}
set -e
cd /mnt/gentoo
mount_if_needed -t proc none /mnt/gentoo/proc
전화 할 때 또 다른 문제가 있습니다 chroot. “chroot에서 bash를 실행하십시오. bash가 종료되면 sourceand를 실행하십시오 export.” 그것은 아마도 당신이 의도 한 것이 아닙니다. /etc/profilebash를 로그인 쉘로 만들어서 읽을 수 있습니다. 가능한 설정 방법은 PS1bash를 실행하기 전에 설정하는 것일 수 있지만, bash를 /etc/profile재정의하면 작동하지 않습니다 . 더 좋은 방법은 설정하는 것입니다 PS1에 ~/.bashrc chroot로 내부에서 실행되는 경우 ( .bashrc하지.profile ).
chroot . bash --login
데비안은 세트에 다음 코드 사용 PS1에서 /etc/bash.bashrc의 내용에 기반을 /etc/debian_chroot:
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
또는 프롬프트에 대신 환경 변수를 사용하십시오.
CHROOT_LOCATION=$PWD chroot bash --login
이것을 ~/.bashrc또는 안에 넣으십시오 /etc/bash.bashrc:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;. 각 명령을 자체 행에 두십시오. 그러나를 제거해야합니다set -e. 명령 실패에 신경 쓰지 않는다면 왜 사용set -e합니까? (질문은 한 줄을 요구했지만 스크립트 내에서는 의미가 없습니다.)