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; mount2ne fonctionnera tout simplement pas car cela s'exécute, mount2qu'il cdré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 -eet 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 /procet 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 sourceet export". Ce n'est probablement pas ce que vous vouliez dire. La lecture /etc/profilepeut être effectuée en faisant de bash un shell de connexion. Un moyen possible de définir PS1peut être de le définir avant d'exécuter bash, mais cela ne fonctionnera pas s'il le /etc/profileremplace, ce qui est courant. Une meilleure façon est de mettre PS1en ~/.bashrc cas d' exécution à l' intérieur d' un chroot ( .bashrcnon.profile ).
chroot . bash --login
Debian utilise le code suivant pour s'installer PS1en /etc/bash.bashrcfonction 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 ~/.bashrcou /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).