危険なシェルの条件付きコメント

危険なシェルの条件付きコメント

私が達成しようとしていることは次のとおりです。

#!/bin/bash
safemode=on

if [ $safemode == 'off' ];then
  run dangerous code
fi

危険な線が 129 本あり、すべて分離されています。これを行う最善の方法は何ですか?

答え1

「最善の方法」は、最大限に努力する必要があると考える量に大きく依存します。 1 つの簡単な方法は、&&例を少し変更して、接続されたコマンド リストを使用することです。 Bash の算術テスト構造のいずれかを使用できます。

#!/bin/bash
safemode=1

(( ! safemode )) && run dangerous code 1
uncritical code
(( ! safemode )) && run dangerous code 2

または通常の文字列ベースの演算子

#!/bin/bash
safemode=on

[[ $safemode = "off" ]] && run dangerous code 1
uncritical code
[[ $safemode = "off" ]] && run dangerous code 2

これは、すでに行った操作の簡略表記にすぎません。が でない場合、[[ ... ]]テストは を生成するため、コマンド リストの実行は で停止します。falsesafemodeoff&&

連鎖コマンド リストの場合&&、終了コードは最後に実行されたコマンドの終了コードになることに注意してください。したがって、safemodeが設定されている場合は、 はそのような「保護された」行の後に$?なります1(終了コードをそのように使用する場合に備えて)。

答え2

変数をまたはsafemodeの 2 つのコマンドのいずれかとして定義すると、それをプレフィックスとして使用できます。truefalse

#!/bin/sh
safemode=true

safe_mode_off() { safemode=false }

"$safemode" || run dangerous code 1
uncritical code
"$safemode" || run dangerous code 2

通常はオプション処理から変数を設定すると思うので、true/は /falseと同じくらい簡単です。onoff


私たちはできたおそらくこれを拡張して (必ずしもそうすべきだとは思いませんが)、危険なコマンドを次のように の引数にするだけでしょうfalse:

#!/bin/sh
risky=false

safe_mode_off() { risky= }

$risky run dangerous code 1
uncritical code
$risky run dangerous code 2

ただし、この場合、引数内で展開が引き続き行われます。たとえば、 は$(dangerous subcommand)引き続き実行されるため、 に変更する必要があります$($risky dangerous subcommand)。これは、本格的な使用ではエラーが発生しやすいと思います。

答え3

短縮形が必要な場合は、エイリアスを使用できます。エイリアスは、通常の展開よりもテキストの置換に近いため、構文構造はできるこれらを介して挿入されます。Bash スクリプトで明示的に有効にするだけで済みます。また、不要なエイリアスを誤って有効にしないようにする必要があります。

#!/bin/bash
unalias -a
shopt -s expand_aliases

# default safe
alias risky='[ "$riskymode" = enabled ] &&'
riskymode=
if [ "$1" = risky ]; then
        riskymode=enabled
fi

echo this is normal
risky echo this is risky

ただし、条件は依然としてリストの一部にすぎないという注意点が残っているので&&、次のようになります。

risky echo try something risky || echo oopsie it failed

echo oopsieリスクモードが無効になっている場合でも実行されます。

しかし、次のことはできます:

risky ( echo try something risky || echo oopsie it failed )

あるいは

risky if ! echo another risky attempt; then echo another failure; fi

(-list 内に複合コマンドを入れることができます&&)


エイリアスを使用して行をコメントにすることもできます。

#!/bin/bash
unalias -a
shopt -s expand_aliases
alias risky='#'
if [ "$1" = risky ]; then
        alias risky=''
fi
risky echo something risky, again || echo "does it fail now?"

しかし、もちろん最初のものは無視されますラインつまり、2 行目は再び「セーフ」モードで実行されます。

risky echo something even more risky ||
    echo "_now_ does it fail?"

関連情報