Avec l' &&
opérateur entre les commandes, chaque commande s'exécute en séquence et si une commande échoue (c.-à-d. Renvoie un état différent de zéro), les commandes suivantes ne sont pas exécutées.
Si vous voulez continuer quoi qu'il arrive, utilisez ;
(ou une nouvelle ligne, qui est équivalente) au lieu de &&
. Ici, vous devez exécuter une commande, et si elle réussit, exécutez d'autres commandes, qu'elles réussissent ou non. Une façon d'y parvenir est de placer ces commandes à l'intérieur d'un groupe d'accolades ( cd … && mount1; mount2
ne fonctionnera tout simplement pas car cela s'exécute, mount2
qu'il cd
réussisse ou non en raison de la priorité).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Sinon, quittez le script ou revenez de la fonction en cas d' cd
échec.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Sinon, exécutez under set -e
et mettez || true
(«ou continuez quand même») après les commandes qui peuvent échouer.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Sinon, écrivez une commande qui doit réussir: testez si /proc
et ainsi de suite sont déjà montés.
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
Vous avez un autre problème où vous appelez chroot
. Vous avez écrit: «lancez bash dans le chroot. Lorsque bash se termine, exécutez source
et export
". Ce n'est probablement pas ce que vous vouliez dire. La lecture /etc/profile
peut être effectuée en faisant de bash un shell de connexion. Un moyen possible de définir PS1
peut être de le définir avant d'exécuter bash, mais cela ne fonctionnera pas s'il le /etc/profile
remplace, ce qui est courant. Une meilleure façon est de mettre PS1
en ~/.bashrc
cas d' exécution à l' intérieur d' un chroot ( .bashrc
non.profile
).
chroot . bash --login
Debian utilise le code suivant pour s'installer PS1
en /etc/bash.bashrc
fonction du contenu de /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\$ '
Sinon, pour l'invite, utilisez une variable d'environnement à la place: exécutez
CHROOT_LOCATION=$PWD chroot bash --login
et mettez-le dans ~/.bashrc
ou /etc/bash.bashrc
:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;
. Mettez simplement chaque commande sur sa propre ligne, mais vous devez également vous débarrasser deset -e
. Si vous ne vous souciez pas de l'échec de la commande, pourquoi même l'utiliserset -e
? (Je connais la question posée pour une ligne, mais cela n'a aucun sens dans un script).Mettez la commande entre crochets - (), de sorte que vous reveniez au répertoire courant, ou cd - à la fin. Si vous mettez cela dans un fichier et l'exécutez: sh ./my_script.sh, il exécutera les commandes dans le répertoire changé en.
En bash
entraînera l'arrêt du script lors du premier échec. Parce que vous avez défini + e, je suppose que vous souhaitez que le script continue de fonctionner si une commande échoue.
la source