Con el &&
operador entre comandos, cada comando se ejecuta en secuencia, y si algún comando falla (es decir, devuelve un estado distinto de cero), los comandos posteriores no se ejecutan.
Si desea continuar, pase lo que pase, use ;
(o una nueva línea, que es equivalente) en lugar de &&
. Aquí, debe ejecutar un comando, y si tiene éxito, ejecute algunos comandos más si tienen éxito o no. Una forma de lograr esto es colocar estos comandos dentro de un grupo de llaves (simplemente cd … && mount1; mount2
no funcionará porque esto se ejecuta con éxito mount2
o no cd
debido a la precedencia).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Alternativamente, salga del script o regrese de la función si cd
falla.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Alternativamente, ejecute debajo set -e
y coloque || true
("o continúe de todos modos") después de los comandos que pueden fallar.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Alternativamente, escriba un comando que debe tener éxito: pruebe si /proc
y así sucesivamente ya están montados.
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
Tienes otro problema donde llamas chroot
. Has escrito: “ejecuta bash en el chroot. Cuando bash salga, corre source
y export
. Eso probablemente no sea lo que quisiste decir. La lectura /etc/profile
se puede hacer haciendo bash un shell de inicio de sesión. Una posible forma de configurarlo PS1
puede ser configurarlo antes de ejecutar bash, pero eso no funcionará si lo /etc/profile
anula, lo cual es común. Una mejor manera es a juego PS1
en ~/.bashrc
si se ejecuta dentro de un chroot ( .bashrc
no.profile
).
chroot . bash --login
Debian utiliza el siguiente código para establecer PS1
en /etc/bash.bashrc
función del contenido 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\$ '
Alternativamente, para la solicitud, use una variable de entorno en su lugar: ejecutar
CHROOT_LOCATION=$PWD chroot bash --login
y poner esto en ~/.bashrc
o /etc/bash.bashrc
:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;
. Simplemente ponga cada comando en su propia línea, pero también debe deshacerse de élset -e
. Si no te importa el fallo del comando, ¿por qué usarloset -e
? (Sé que la pregunta solicitó una línea, pero eso no tiene sentido dentro de un guión).Ponga el comando entre paréntesis - (), para que regrese al directorio actual, o cd - al final. Si coloca esto en un archivo y lo ejecuta: sh ./my_script.sh ejecutará los comandos en el directorio cambiado a.
En bash
hará que el script deje de ejecutarse en el primer error. Debido a que ha configurado + e, supongo que desea que el script continúe ejecutándose si falla un comando.
fuente