З &&оператором між командами кожна команда запускається послідовно, і якщо будь-яка команда не працює (тобто повертає ненульовий статус), наступні команди не виконуються.
Якщо ви хочете продовжувати роботу незалежно від того, використовуйте ;(або новий рядок, що еквівалентно) замість &&. Тут потрібно виконати одну команду, і якщо це вдасться, виконати ще кілька команд, успішні вони чи ні. Один із способів досягти цього - помістити ці команди всередині групи брекетів (просто cd … && mount1; mount2не буде працювати, оскільки це виконує, mount2чи не cdвдалося це в силу переваги).
cd /mnt/gentoo && {
mount -t proc none /mnt/gentoo/proc
mount --rbind /dev /mnt/gentoo/dev
mount --rbind /sys /mnt/gentoo/sys
…
}
Крім того, вийдіть із скрипту або поверніться з функції, якщо cdне вдалося.
cd /mnt/gentoo || exit $?
mount -t proc none /mnt/gentoo/proc
…
Крім того, запустіть внизу set -eі поставте || true(«або продовжуйте все одно») після команд, які можуть не виконати.
set -e
cd /mnt/gentoo
mount -t proc none /mnt/gentoo/proc || true
…
Крім того, напишіть команду, яка повинна досягти успіху: перевірити, якщо /procі так далі вже встановлені.
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
У вас є ще одна проблема, куди дзвоніть chroot. Ви писали: «Запускай баш у chroot. Коли баш виходить, біжіть sourceі export. " Це, мабуть, не те, що ви мали на увазі. Читання /etc/profileможна зробити, зробивши bash оболонку для входу. Можливим способом встановлення PS1може бути встановлення його перед запуском bash, але це не спрацює, якщо /etc/profileвін замінить його, що є загальним. Кращий спосіб полягає в наборі PS1в ~/.bashrc при роботі в ізольованому оточенні ( .bashrcНЕ.profile ).
chroot . bash --login
Debian використовує наступний код для встановлення PS1на /etc/bash.bashrcоснові вмісту /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\$ '
Крім того, для підказки, замість цього використовуйте змінну середовища: запустити
CHROOT_LOCATION=$PWD chroot bash --login
і помістити це в ~/.bashrcабо /etc/bash.bashrc:
if [ -n "$CHROOT_LOCATION" ]; then PS1="($CHROOT_LOCATION)$PS1"; fi
;. Просто поставте кожну команду у свій рядок, але ви також повинні позбутися відset -e. Якщо вас не хвилює збій команди, навіщо взагалі використовуватиset -e? (Я знаю, що питання задавали один рядок, але це не має сенсу в сценарії).