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; mount2
funktioniert einfach nicht, da dies ausgeführt wird, mount2
unabhängig davon, ob dies cd
aufgrund 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 cd
fehlschlägt.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Alternativ können Sie unter ausführen set -e
und || true
nach 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 /proc
usw. 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 source
und export
. “ Das haben Sie wahrscheinlich nicht gemeint. Das Lesen /etc/profile
kann erfolgen, indem bash zu einer Login-Shell gemacht wird. Eine mögliche Möglichkeit zum PS1
Festlegen 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 PS1
in , ~/.bashrc
wenn innerhalb einer chroot läuft ( .bashrc
nicht.profile
).
chroot . bash --login
Debian verwendet den folgenden Code Satz PS1
in /etc/bash.bashrc
basierend 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 ~/.bashrc
oder /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).