Bash:if [tar = error] [closed]の場合


-1

私はシェルスクリプトにメッセージを書くかどうかに応じて欲しい tar 成功または失敗しますが、このスクリプトは正しく機能しません。

TAR=$(tar -cf Archiv.tar myfolder/ myotherfolder/)
if [ ! "$TAR" = "/dev/null" ]; then
   echo "success"
else
  echo "error - no such Directory or file"
fi

何が問題ですか?


2
あなたはそのスクリプトが何をするべきか、そして「動かない」ということが何を意味するのかを説明しなければならないでしょう。 tarが "/ dev / null"を印刷し、それ以外のメッセージが表示された場合、なぜ "success"を印刷したいのかまったくわかりません。
psusi

回答:


3

私は状況がわからない 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行は一緒に上記のバージョンと同じことをします $? 最後に実行されたプログラムのステータスコードを保持します。

これはおそらくより明確ですが、少し無駄です。


Warren Youngありがとうございます。そして、私は「処理する」ことができますか?例:if [$ TAR = 0]の場合
Jannyeis

@ Jannyeis:どういう意味なのかよくわかりません。走れば tar 内部 $() 元のコードのように、あなたはその出力をキャプチャしています。だから、その出力を0と比較してもあなたが望むことをする可能性は低い。あなたは興味を持っています 終了ステータスコード プログラムのテキスト出力ではありません。
Warren Young

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 && cmd2cmd2 次の場合にのみ実行されます cmd1 エラーなしで終了する(終了コード付き) 0 ) 代わりに cmd1 || cmd3cmd3 次の場合にのみ実行されます 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 ]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.