Mit dem &&Operator zwischen Befehlen wird jeder Befehl nacheinander ausgeführt. Wenn ein Befehl fehlschlägt (dh einen Status ungleich Null zurückgibt), werden die nachfolgenden Befehle nicht ausgeführt.
Wenn Sie auf ;jeden Fall weitermachen möchten, verwenden Sie stattdessen (oder eine neue Zeile, die gleichwertig ist) &&. Hier müssen Sie einen Befehl ausführen. Wenn dies erfolgreich ist, führen Sie weitere Befehle aus, unabhängig davon, ob sie erfolgreich sind oder nicht. Eine Möglichkeit, dies zu erreichen, besteht darin, diese Befehle in eine Klammergruppe einzufügen ( cd … && mount1; mount2funktioniert einfach nicht, da dies ausgeführt wird, mount2unabhängig davon, ob dies cdaufgrund der Priorität erfolgreich ist oder nicht ).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Alternativ können Sie das Skript beenden oder von der Funktion zurückkehren, wenn dies cdfehlschlägt.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Alternativ können Sie unter ausführen set -eund || truenach fehlgeschlagenen Befehlen setzen ("oder trotzdem weitermachen").
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Alternativ können Sie einen Befehl schreiben, der erfolgreich sein muss: Testen Sie, ob /procusw. bereits bereitgestellt sind.
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
Sie haben ein anderes Problem, bei dem Sie anrufen chroot. Sie haben geschrieben: „Führen Sie Bash in the Chroot aus. Wenn Bash beendet ist, renne sourceund export. “ Das haben Sie wahrscheinlich nicht gemeint. Das Lesen /etc/profilekann erfolgen, indem bash zu einer Login-Shell gemacht wird. Eine mögliche Möglichkeit zum PS1Festlegen besteht darin, es vor dem Ausführen von bash festzulegen. Dies funktioniert jedoch nicht, wenn es /etc/profileüberschrieben wird, was häufig der Fall ist. Eine bessere Art und Weise eingestellt ist PS1in , ~/.bashrc wenn innerhalb einer chroot läuft ( .bashrcnicht.profile ).
chroot . bash --login
Debian verwendet den folgenden Code Satz PS1in /etc/bash.bashrcbasierend auf dem Inhalt von /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\$ '
Alternativ können Sie für die Eingabeaufforderung stattdessen eine Umgebungsvariable verwenden: run
CHROOT_LOCATION=$PWD chroot bash --login
und setzen Sie dies in ~/.bashrcoder /etc/bash.bashrc:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;. Setzen Sie einfach jeden Befehl in eine eigene Zeile, aber Sie müssen auch den loswerdenset -e. Wenn Sie sich nicht für Befehlsfehler interessieren, warum überhaupt verwendenset -e? (Ich kenne die Frage, die für eine Zeile gestellt wurde, aber das macht in einem Skript keinen Sinn).