Bashスクリプトはデバッグモードでのみ実行されます。

Bashスクリプトはデバッグモードでのみ実行されます。

次の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)

今、すべてがうまくいきます。

おすすめ記事