ディレクトリにCDを移動し、多くのコマンドを実行します。

ディレクトリにCDを移動し、多くのコマンドを実行します。

次のスクリプトがあります。

#!/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)。mount2cd

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/profilebashをログインシェルに設定して読み取りを実行できます。これを設定する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

おすすめ記事