Z &&
operatorem między poleceniami, każde polecenie uruchamia się w sekwencji, a jeśli którekolwiek polecenie zakończy się niepowodzeniem (tj. Zwraca niezerowy status), kolejne polecenia nie zostaną wykonane.
Jeśli chcesz kontynuować bez względu na wszystko, użyj ;
(lub nowej linii, która jest równoważna) zamiast &&
. Tutaj musisz wykonać jedno polecenie, a jeśli się powiedzie, wykonaj kilka kolejnych poleceń, niezależnie od tego, czy się powiedzie. Jednym ze sposobów na osiągnięcie tego jest umieszczenie tych poleceń w grupie nawiasów klamrowych (po prostu cd … && mount1; mount2
nie zadziała, ponieważ spowoduje to, mount2
czy cd
uda się z powodu pierwszeństwa).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Ewentualnie wyjdź ze skryptu lub powróć z funkcji, jeśli się cd
nie powiedzie.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Alternatywnie, biegnij pod set -e
i wstaw || true
(„lub idź dalej”) po poleceniach, które mogą się nie powieść.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Możesz też napisać polecenie, które musi się powieść: sprawdź, czy /proc
i tak jest już zamontowane.
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
Masz inny problem, gdy dzwonisz chroot
. Napisałeś: „uruchom bash w chroot. Kiedy bash zakończy działanie, uruchom source
i export
. ” Prawdopodobnie nie o to ci chodziło. Czytanie /etc/profile
można wykonać, czyniąc bash powłoką logowania. Możliwym sposobem ustawienia PS1
może być ustawienie go przed uruchomieniem bash, ale to nie zadziała, jeśli /etc/profile
zastąpi to, co jest powszechne. Lepszym sposobem jest ustawienie PS1
w ~/.bashrc
razie działa wewnątrz chroot ( .bashrc
nie.profile
).
chroot . bash --login
Debian używa następującego kodu do ustawienia PS1
na /etc/bash.bashrc
podstawie zawartości /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\$ '
Alternatywnie, w wierszu polecenia zamiast tego użyj zmiennej środowiskowej: uruchom
CHROOT_LOCATION=$PWD chroot bash --login
i wstaw to ~/.bashrc
lub /etc/bash.bashrc
:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;
. Po prostu umieść każde polecenie w osobnej linii, ale musisz się go również pozbyćset -e
. Jeśli nie obchodzi Cię błąd polecenia, po co w ogóle korzystaćset -e
? (Znam pytanie zadane dla jednej linii, ale nie ma to sensu w skrypcie).Umieść polecenie w nawiasach - (), aby powrócić do bieżącego katalogu lub cd - na końcu. Jeśli umieścisz to w pliku i uruchomisz: sh ./my_script.sh, uruchomi polecenia w katalogu zmienionym na.
W bash
spowoduje, że skrypt przestanie działać przy pierwszej awarii. Ponieważ ustawiłeś + e, zakładam, że chcesz, aby skrypt działał, jeśli polecenie się nie powiedzie.
źródło