web-dev-qa-db-ja.com

debootstrapからの終了コードがないのはなぜですか?

私はbashスクリプトを介してchrootでdebootstrapをテストしています。

それを実行するスニペットは次のとおりです。

#!/usr/bin/env bash
set -e
...
...
Sudo debootstrap --verbose --Arch=${Arch} ${RELEASE} ${chroot_dir}
if [ "$?" -ne "0" ]; then
  echo "debootstrap failed."
  echo "See ${chroot_dir}/debootstrap/debootstrap.log for more information."
  exit 1
fi

echo "debootstrap succeeded"

ただし、スクリプトの実行後、端末に出力される最後の行は次のとおりです。

I: Chosen extractor for .deb packages: dpkg-deb
I: Extracting adduser...

失敗したor成功したメッセージが表示されません。

Chrootのdebootstrapログには次のように書かれています。

tar: ./usr/sbin/addgroup: Cannot create symlink to 'adduser': File exists
tar: ./usr/sbin/delgroup: Cannot create symlink to 'deluser': File exists
tar: Exiting with failure status due to previous errors

したがって、明らかに何かが失敗しました。

エラーチェックブロックでこれをキャッチできないのはなぜですか?

1
opticyclic

終了コードをテストするだけの場合、bashの構文は次のとおりです。

if debootstrap --verbose --Arch=${Arch} ${RELEASE} ${chroot_dir}
then
  echo Success
else
  echo Failure
fi

他の方法が機能しない理由は、set -eはスクリプトを終了させますbefore終了コードがテストされます。

終了値とエラートラップの詳細については、次のリンクを参照してください。

1
dessert