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; mount2no funcionará porque esto se ejecuta con éxito mount2o no cddebido 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 cdfalla.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Alternativamente, ejecute debajo set -ey 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 /procy 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 sourcey export. Eso probablemente no sea lo que quisiste decir. La lectura /etc/profilese puede hacer haciendo bash un shell de inicio de sesión. Una posible forma de configurarlo PS1puede ser configurarlo antes de ejecutar bash, pero eso no funcionará si lo /etc/profileanula, lo cual es común. Una mejor manera es a juego PS1en ~/.bashrc si se ejecuta dentro de un chroot ( .bashrcno.profile ).
chroot . bash --login
Debian utiliza el siguiente código para establecer PS1en /etc/bash.bashrcfunció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 ~/.bashrco /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