これが私が達成したいものです。
#!/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
これは、すでに実行中の作業の非常に簡単な表記です。それ以外の場合は[[ ... ]]
テストが生成されるため、コマンドリストの実行は 。false
safemode
off
&&
&&
リンクされたコマンドリストの場合、終了コードは最後に実行されたコマンドの終了コードであるため、設定すると「保護された」行の後に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
/は/と同じくらい簡単ですfalse
。on
off
私たちできる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?"