
次のbashスクリプトがあります。
#!/bin/bash -e
SUDO=sudo
$SUDO apt-get -y update || true
$SUDO apt-get -y install lxc bridge-utils || true
# remove the default bridge, if it exists
DEFAUT_BRIDGE=$(brctl show | grep "lxcbr0")
if ! [ -z "${DEFAULT_BRIDGE}" ]
then
$SUDO ip link set dev lxcbr0 down
$SUDO ip link del dev lxcbr0
fi
# add the WiFi and Mobile bridges, if they don't exist yet
WIFI_BRIDGE=$(brctl show | grep "lxcbr_wifi")
MOBILE_BRIDGE=$(brctl show | grep "lxcbr_wifi")
echo "${MOBILE_BRIDGE}"
echo "${WIFI_BRIDGE}"
if [ -z "${WIFI_BRIDGE}" ]
then
echo "adding wifi bridge"
$SUDO brctl addbr lxcbr_wifi
$SUDO brctl addif lxcbr_wifi $(./network identify wifi)
$SUDO ip link set dev lxcbr_wifi up
fi
if [ -z "${MOBILE_BRIDGE}" ]
then
echo "adding mobile bridge"
$SUDO brctl addbr lxcbr_mobile
$SUDO brctl addif lxcbr_mobile $(./network identify mobile)
$SUDO ip link set dev lxcbr_mobile up
fi
オプションset -xを使用してデバッグモードでスクリプトを実行しないと、2番目のapt-getコマンドでスクリプトが失敗します。 apt-get が 0 を返し ($? 値を確認する)、エラーを返しても "||true" が表示されるため、スクリプトがクラッシュする理由を理解できません。
奇妙なことは、デバッグモードでスクリプトを実行すると、すべてがうまく機能することです。私は何を見逃していますか? apt-getのバグですか、それともスクリプトの内容ですか?
答え1
わかりましたら、私は奇妙な場所を探していたようです。スクリプトが失敗します。
DEFAUT_BRIDGE=$(brctl show | grep "lxcbr0")
ブリッジ "lxcbr0" が終了しない場合、grep はエラーで失敗し、スクリプトを停止します。この行を修正しました
DEFAUT_BRIDGE=$(brctl show | grep "lxcbr0" || true)
今、すべてがうまくいきます。