私はシェルスクリプトにメッセージを書くかどうかに応じて欲しい tar
成功または失敗しますが、このスクリプトは正しく機能しません。
TAR=$(tar -cf Archiv.tar myfolder/ myotherfolder/)
if [ ! "$TAR" = "/dev/null" ]; then
echo "success"
else
echo "error - no such Directory or file"
fi
何が問題ですか?
私はシェルスクリプトにメッセージを書くかどうかに応じて欲しい tar
成功または失敗しますが、このスクリプトは正しく機能しません。
TAR=$(tar -cf Archiv.tar myfolder/ myotherfolder/)
if [ ! "$TAR" = "/dev/null" ]; then
echo "success"
else
echo "error - no such Directory or file"
fi
何が問題ですか?
回答:
私は状況がわからない tar
出力します /dev/null
エラーを通知するには、コードがエラーを検出しようとします。これはエラーをチェックする正しい方法です。
if tar -cf Archiv.tar myfolder/ myotherfolder/
then
echo "success"
else
echo "error - no such Directory or file"
fi
あなたはおそらく必要ありません else
という理由で tar
その場合はそれ自体が文句を言うでしょう。ご使用の場合 /dev/null
抑制するはずだった tar
あなたがあなた自身のメッセージを置き換えることができるように苦情は、その後、最初の行はする必要があります:
if tar -cf Archiv.tar myfolder/ myotherfolder/ > /dev/null 2>&1
ここでは角括弧を使用していません。これは実際には以下のような組み込みシェルコマンドのエイリアスです。 test(1)
これは論理演算を行い、成功または失敗を示すためにそれぞれ0またはゼロ以外の値を返します。 if
次に、この0 /ゼロ以外の戻り値をチェックします。そのため、次のようなプログラムの成功をチェックするために tar
失敗した場合はゼロ以外の値を返します。関与する必要はありません。 test
またはその別名 [
。
あなたが周囲の何らかの句読点を必要とするプログラミング言語について訓練されたならば if
句読点の欠如があなたを煩わせるような式なので、最初の行を次のように書き換えることができます。
tar -cf Archiv.tar myfolder/ myotherfolder/
if [ $? = 0 ]
これらの2行は一緒に上記のバージョンと同じことをします $?
最後に実行されたプログラムのステータスコードを保持します。
これはおそらくより明確ですが、少し無駄です。
tar
内部 $()
元のコードのように、あなたはその出力をキャプチャしています。だから、その出力を0と比較してもあなたが望むことをする可能性は低い。あなたは興味を持っています 終了ステータスコード プログラムのテキスト出力ではありません。
いつものように、あなたがしようとしていたことをするための方法はもう一つあります。
これは(おそらくコンパクトな)方法です。
#!/bin/bash
TAR_COMMAND='tar -cf Archiv.tar myfolder/ myotherfolder/ 2>/dev/null'
MSG_OK='### Work well DONE ### ' # A more common way to use a variable
MSG_ERR='### OPS IT FAILS ### '
$TAR_COMMAND && echo $MSG_OK || echo $MSG_ERR
短いメモ
あなたが持っている場合 終了ステータスを保存する必要はありません あなたのコマンドの(または終了コード)あなたはオペレータの直後に使うことができます そして 、 &&
、そして または 、 ||
[ 1 ] 。
ロジックは: cmd1 && cmd2
、 cmd2
次の場合にのみ実行されます cmd1
エラーなしで終了する(終了コード付き) 0
)
代わりに cmd1 || cmd3
、 cmd3
次の場合にのみ実行されます cmd1
エラーで終了します(エラーコードは 0
)
代わりに、あなたが 終了コードを保存したい 次回のコマンド実行ではこの値が更新されるため、コマンドの実行直後に実行する必要があります。それは十分な変数代入です
mycommand # you execute your command
ExitCodeToUseLater=$? # So I can use it later in the script
# ... other stuffs ...
[ $ExitCodeToUseLater = 0 ] && echo "It was gone ok "
# ... again other stuffs ...
[ $ExitCodeToUseLater = 0 ] || echo "# Never a time that it goes as I want"
bashスクリプティング、およびメークファイルで [ 2a 、 2b ] 、 発見できる コマンド 多くのオプションで 変数で書かれた コードを読みやすくするために(上記のように TAR_COMMAND
変数)。シェルで変数を書く $MyVar
それはシェルの中に書かれているものを書くのと同じでしょう [ 3 ] 。スクリプトでも動作します。あなたはbashの展開と代入規則に注意を払う必要があるかもしれません。 man bash
。
/dev/null
それは ヌルデバイス [ 4 ] 、 「書き込まれたすべてのデータを破棄し、書き込み操作が成功したことを報告するデバイスファイル」 。それはコマンドに空の入力を与えるために使うことができます( </dev/null
)標準出力または標準エラーを "絶対無音"で渡す [ 5 ] 。