Com o &&
operador entre os comandos, cada comando é executado em sequência e, se algum comando falhar (ou seja, retorna um status diferente de zero), os comandos subseqüentes não são executados.
Se você quiser continuar, não importa o quê, use ;
(ou uma nova linha, que é equivalente) em vez de &&
. Aqui, você precisa executar um comando e, se for bem-sucedido, execute mais alguns comandos, sejam eles bem-sucedidos ou não. Uma maneira de conseguir isso é colocar esses comandos dentro de um grupo de chaves (simplesmente cd … && mount1; mount2
não funcionará porque isso executa mount2
se é ou não cd
bem-sucedido devido à precedência).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Como alternativa, saia do script ou retorne da função se cd
falhar.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Como alternativa, execute sob set -e
e coloque || true
("ou continue assim mesmo") após os comandos que podem falhar.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Como alternativa, escreva um comando que deve ter êxito: teste se /proc
já está montado.
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
Você tem outro problema onde liga chroot
. Você escreveu: “execute bash no chroot. Quando o bash sair, corra source
e export
. ” Provavelmente não foi isso que você quis dizer. A leitura /etc/profile
pode ser feita tornando o bash um shell de login. Uma maneira possível de configurar PS1
pode ser configurá-lo antes de executar o bash, mas isso não funcionará se o /etc/profile
substituir, o que é comum. A melhor maneira é definir PS1
em ~/.bashrc
se estiver rodando dentro de um chroot ( .bashrc
não.profile
).
chroot . bash --login
O Debian usa o seguinte código para configurar PS1
com /etc/bash.bashrc
base no conteúdo 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\$ '
Como alternativa, para o prompt, use uma variável de ambiente: run
CHROOT_LOCATION=$PWD chroot bash --login
e coloque isso em ~/.bashrc
ou /etc/bash.bashrc
:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;
. Basta colocar cada comando em sua própria linha, mas você também precisa se livrar doset -e
. Se você não se importa com a falha do comando, por que usarset -e
? (Eu sei que a pergunta fez uma linha, mas isso não faz sentido em um script).Coloque o comando entre colchetes - (), para retornar ao diretório atual ou cd - no final. Se você colocar isso em um arquivo e executá-lo: sh ./my_script.sh, ele executará os comandos no diretório alterado para.
Na festança
fará com que o script pare de executar na primeira falha. Como você configurou + e, eu assumiria que você desejava que o script continuasse sendo executado se um comando falhar.
fonte