次のスクリプトがあります。
#!/bin/bash
mount /dev/sda6 /mnt/gentoo
set +e
cd /mnt/gentoo && mount -t proc none /mnt/gentoo/proc \
&& mount --rbind /dev /mnt/gentoo/dev \
&& mount --rbind /sys /mnt/gentoo/sys \
&& chroot /mnt/gentoo /bin/bash \
&& source /etc/profile \
&& export PS1="(chroot)$PS1"
ここで達成したいことは、ディレクトリを変更して/mnt/gentoo
いくつかのコマンドを実行することです。パスがマウントされていない最初は正しく機能します。ただし、特定のパスで正常にインストールした後に実行すると、続行せず、最初の失敗時に停止します。 「すでにインストール済み」エラーが原因でインストールが失敗した場合でも、すべてのコマンドを実行したいと思います。どうすればいいですか?
これらすべてのコマンドを一緒に組み合わせるより良い方法は何ですか?
ベストアンサー1
コマンド間で演算子を使用すると、&&
各コマンドが順番に実行され、コマンドが失敗した場合(つまり、ゼロ以外の状態を返す場合)、後続のコマンドは実行されません。
とにかく続行するには、;
代わりに(またはそれに対応する改行)を使用してください&&
。ここでコマンドを実行する必要があり、成功した場合、成功または失敗に関係なく、さらにいくつかのコマンドを実行する必要があります。これを達成する1つの方法は、これらのコマンドを中括弧グループに入れることです(優先順位が成功したかどうかにかかわらずコマンドが実行されるため、機能しません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でbashを実行してください。bashが終了したら実行してくださいsource
。"と書かれました。export
おそらくそのような意味ではないでしょう。/etc/profile
bashをログインシェルに設定して読み取りを実行できます。これを設定する1つの可能な方法PS1
はbashを実行する前に設定することですが、上書きすると機能しないのが/etc/profile
一般的です。より良いアプローチPS1
は~/.bashrc
chroot内で実行している場合(.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