危険なエンクロージャの状態に関するコメント [閉じる]

危険なエンクロージャの状態に関するコメント [閉じる]

これが私が達成したいものです。

#!/bin/bash
safemode=on

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

私は129本の危険線を持っており、すべて別々です。最良のアプローチは何ですか?

答え1

「最良の方法」は、何を最大の努力と見なすかによって大きく異なります。非常に簡単なアプローチは、&&-connectedコマンドのリストを使用して例を少し変更することです。 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つのコマンドのいずれかとして定義するか、trueプレフィックスfalseとして使用できます。

#!/bin/sh
safemode=true

safe_mode_off() { safemode=false }

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

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


私たちできる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?"

関連情報