• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コマンド終了ステータス)

rsync終了ステータスによって処理を切り替える方法

0909unionの回答

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.5

もう一つおまけ。 >コマンドの仕様により、0だったり、1だったり ちょうどいいサンプルがありましたので、 http://shellscript.sunone.me/exit_status.html input_check.shのスクリプトですね。exprの計算が成功し0となるはずが、計算結果が0になる。exprの仕様により結果が0の場合、終了ステータスは異常を示す1が返る。 実行は成功しているにもかかわらず、結果の内容によりステータスを変える。 これは、良くある事なので、それぞれのコマンドで違うのである。 また ”「 rm -f 」の終了ステータス” の項目も理解しておいて欲しい。 何がいいたいか理解していただけましたでしょうか? 文献としては古いので、かならずしもその通りになるとは限りませんが、先人の苦悩を拾うことが重要です。 その文献の初めにありますが 「各コマンドにより異なるが、一般的にはコマンド成功時には「0」が、失敗時には「1」が設定される。」 と言うこと。各コマンドにより違うのである。 あなたの疑問は input_check.shのスクリプトを同じシェル内で、同時実行してみたり、別シェル(ウインドウ)で同時実行してみたり、crontabで同時刻にやってみて、どうなるか試したらいかかですか? 例えば、違う結果になるようにして、別シェルで同時実行したらどうなるか?

関連するQ&A

  • 終了ステータスの確認

    基本的な事ですみませんが、2点程確認したい事があります。 1.あるシェルがあり、プログラムを実行しています。 ---------------------------- echo 'プログラム start' /export/program > /export/keka.lst echo 'プログラム end' ---------------------------- このシェルの終了ステータスは、 プログラムの実行結果になるのでしょうか? 最後にechoを出力しているので、 終了ステータスはechoの結果(必ず正)にはならないんですよね? 2.複数の処理A、B、Cがあるとします。 処理Aの結果を終了ステータスとしたい場合、 概ね以下のような方法で良いのでしょうか? (処理B、処理Cがどのような結果でも処理Aの結果を返す) ------------------------ 処理A ENDSTATUS=$? 処理B 処理C exit ${ENDSTATUS} ------------------------ 以上、片方でも構いません。よろしくお願いします。

  • UNIX teeコマンドについて

    あるテストプログラムの実行結果をteeコマンドで、ログに追加出力しようとしています 以下の1.変更前の様にシェルスクリプトを作成しました。 このシェルスクリプトを実行するとteeコマンドが正常終了するので $? が常に0になってしまい、必ずOKになってしまいます 急いでいたので2.のように修正したのですが、テンプファイルを使わないでもうちょっとシンプルに作成する方法をご存知の方教えてください 1.変更前 ./testpgm | tee -a logfile.txt  if [ $? -eq 0 ] ; then  echo "OK,testpgm," | tee -a logfile.txt else echo "NG,testpgm," | tee -a logfile.txt fi 2.変更後 ./testpgm > tempfile.txt if [ $? -eq 0 ] ; then cat tempfile.txt>>logfile.txt cat tempfile.txt echo "OK,testpgm," | tee -a logfile.txt else cat tempfile.txt>>logfile.txt cat tempfile.txt echo "NG,testpgm," | tee -a logfile.txt fi rm tempfile.txt OSはAIXで、シェルはshのみ使用可です

  • シェルスクリプトの関数

    #!/usr/bin/bash SOURCEBASE="`echo \"$1\" | sed 's/\.[^.]*$//'`" DOCLEAN='no' # 「-c」オプションで削除するファイルの拡張子一覧 CLEANEXTS='aux log toc lof lot bbl blg idx ind ilg' show_help() {   cat <<EOF autolatex [options] latex-source[.tex]  -c  Clean temporary files before typesetting EOF   exit 1 } do_clean() {   for ext in $CLEANEXTS; do    if [ -f ${SOURCEBASE}.${ext} ] ; then      echo "hoge1"      echo ${SOURCEBASE}.${ext}      rm ${SOURCEBASE}.${ext}    fi   done } if [ $# -eq 0 ] ; then  show_help  exit 1 fi while getopts c: flag; do   case ${flag} in   c) DOCLEAN='yes';;   \?) exit 1;;   esac done do_clean #if [ ${DOCLEAN} = 'yes' ] ;then # # echo "hoge2" # do_clean #fi やりたいこととしては*.auxや*.logファイルを-cのオプションをつけた時に削除されることです. とりあえず手始めに取り合えず動くかの確認をしました $ bash test.sh hoge.tex hoge1 hoge.aux hoge1 hoge.log 次にコメントアウトしている部分を取り除いて(さらにその上にあるdo_cleanもコメントアウトします) #do_clean if [ ${DOCLEAN} = 'yes' ] ;then  echo "hoge2"  do_clean fi $ bash test.sh -c hoge.tex hoge2 同様に実行しました.結果は上のようになりif分はtrueで認識されているのですが,その次のdo_cleanでecho部分でのhoge1が表示されません. if分で分岐させている時は関数を別の呼び方で呼ばないといけないのでしょうか? さらに, do_clean if [ ${DOCLEAN} = 'yes' ] ;then  echo "hoge2"  # do_clean fi このようにしても結果は変わりませんでした. (オプションでなにか気をつけなければならない?) オプションをつけたときだけ該当するファイルを削除したいです,ご教授ねがいます><(なお空白はすべて全角空白になっています)

  • シェルで and/or の優先順位について

    echo "" echo " $BAR1 | $BAR2 | $BAR3 " echo "  ̄ ̄ ̄ ̄ ̄ ̄ ̄" echo " $BAR4 | $BAR5 | $BAR6 " echo "  ̄ ̄ ̄ ̄ ̄ ̄ ̄" echo " $BAR7 | $BAR8 | $BAR9 " echo "" if [ $BAR1 -eq $BAR2 -a $BAR1 -eq $BAR3 -o \ $BAR4 -eq $BAR5 -a $BAR4 -eq $BAR6 -o \ $BAR7 -eq $BAR8 -a $BAR7 -eq $BAR9 -o \ $BAR1 -eq $BAR5 -a $BAR1 -eq $BAR9 -o \ $BAR7 -eq $BAR5 -a $BAR7 -eq $BAR3 ]; then SCORE=`expr $SCORE + 700` else SCORE=`expr $SCORE - 30` fi echo "" echo " スコアは【 $SCORE 】 です。 " echo "" 簡単なスロットゲームを作ってみました。C言語では可能な AND/ORの優先順位づけ()がbashでも機能するでしょうか?自分なりにGoogleを探ってみましたが、満足のいく回答は見つけられませんでした。 以下の例では、エラーを返しました。 if [ (($BAR1 -eq $BAR2) -a ($BAR1 -eq $BAR3)) -o \ (($BAR4 -eq $BAR5) -a ($BAR4 -eq $BAR6)) -o \ … なお、manコマンドで以下の説明を見つけましたが、知識が足りずよく意味がわかりません。 なお、コピペの都合上、スペースやタブなどが反映されず、スクリプトが見づらくなっていますが、ご容赦願います。 ************************************************************* (list) list はサブシェル内で実行されます。シェルの環境に影響を与えるような変数の代入や組み込みコマンドは、コマンドの終了後に影響を残しません。返却ステータスは list の終了ステータスです。

  • ディレクトリ監視シェルスクリプト

    お世話になっております。 現在、特定のディレクトリを監視するという仕事をしております。 そこで、監視を人ではなく、シェル(ツール)化しようと考えております。そこでご相談があります。 以下の手順ができるようなシェルを作成しようと考えております。 ---------------------------------------------------------------- 例) /home配下にディレクトリまたはファイルが追加された場合。 以下の対話処理が走り、yを押すとhoge-serverのサービスが 再起動され、n(y以外)を押すと何もしない。 ↓ echo"/home配下にhogeディレクトリが作成されました。" echo"サービスを再起動しますか?(y/n)" read lm if [ $lm -eq y ]; then /sbin/service hoge-service restart ---------------------------------------------------------------- 肝心の/home配下の監視という部分がよくわかりませんでした。 どなたかわかる方がいたら教えて下さい。 宜しくお願いします。

  • killでプロセスを終了したときの”終了しました”を表示させたくない

    お世話になります。 下記の内容のシェルスクリプトを実行すると数字の1~5が表示され最後に”終了しました”(LANG=Cだと”Terminated”)と表示されます。この”終了しました”を表示させたくないのですが何か良い方法はありますでしょうか? よろしくお願い致します。 ------- 以下シェルスクリプト -------- #!/bin/sh i=0 ( while : do sleep 1 done & ) | while : do echo $i if [ $i -eq 5 ];then kill -TERM 0 fi i=`expr $i + 1` done

  • Windowsコマンドプロンプトについて

    お世話になっております。 簡単なバックアップスクリプトをbatで作っていたのですが、 正常に動作していたコマンドが急にループしたり、別のコマンドを実行しても前回のループするコマンドが実行されるようになってしまいました。 コマンドプロンプトを新規に立ち上げても治らず、再起動すれば治るのですが原因が知りたくて質問させていただきました。 実行したコマンドです。 ===================== robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt ===================== 実行結果は以下な感じです。 ===================== #### 正常時 > robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt 正常終了 > #### 再実行 > robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt (←実行コマンド) > robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt (ループ) > robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt (ループ) ・・・・ループ #### 引数なしで実行 > robocopy  (←実行コマンド) > robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt (ループ) > robocopy src tar /E /LOG:%date:~0,4%-%date:~5,2%-%date:~8,2%.txt (ループ) ・・・・ループ #### 別コマンドで実行 > echo "test" 正常終了 > ===================== 環境は以下です。 ===================== Windows 10 Pro Version 1909 OS build 18363.1198 ===================== よろしくお願いいたします。

  • cronを介してのscpの挙動おかしい

    CentOS5系(64bit) expect5.45 Tcl8.6.0 Tk8.6.0 下記のデータダウンロードのスクリプトをcronに設定して自動実行していますが、 エラーも吐き出されずデータがダウンロードされません。 しかしながら、./download.shとコマンドを打鍵するとデータがダウンロードされます。 PCが壊れる前には、正常に動作していたスクリプトファイルなのです。 新しいPCに環境を再構築しまして、挙動がおかしいのですが、 インストール等がうまくいってないって事でしょうか。 お詳しい方、ご教授願えれば幸いです。 ー略- alive_time=3600 logFile=/home/admin/scp.log echo `date` >> $logFile expect -c " log_file $logFile set timeout $alive_time spawn scp $host $local sleep 1 expect { \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\r\" expect \"password:\" send \"${passwd}\r\" } \"password:\" { send \"${passwd}\r\" } } expect { \"denied\" { exit 2 } \ eof { sleep 1 exit 1 } } " ret=$? if [ $ret -eq 0 ] then echo "abort" >> $logFile else if [ $ret -eq 1 ] then echo "done" >> $logFile else if [ $ret -eq 2 ] then echo "fail" >> $logFile fi fi fi exit $ret

  • bashスクリプト

    bashスクリプト #!/bin/bash if [ -f *.log ]; then  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi このようなスクリプトでecho ``(バックオート)でコマンドを実行できると思うんですが, tar czf $(date +"%Y_%m_%d").tar.gz *.log←これ自体を表示できないでしょうか? いまは,以下のようにしてコマンドを実行させ,さらに表示させています. これだとあまり賢くないというか,1行でスマートに表示させたいのですが, 可能でしょうか? if [ -f *.log ]; then  echo "tar czf $(date +"%Y_%m_%d").tar.gz *.log"  echo `tar czf $(date +"%Y_%m_%d").tar.gz *.log` fi

  • ○個表示して終了

    「ログの上位○個までを表示する」と言うのをしようとしていますが、うまく出来ません。 一部抜粋すると… $max = 20; open (FILE./log.log"); $i=0; while (<FILE>) { $i++; local($no,$pt,$sub,) = split(/<>/); if ($pt eq $ARGV[0]){ print "~ } if ($i >= $max) { last; } } close(FILE); このようにしていますが、なぜか正常に表示されません。 (例) ・$maxを3にしているのに1つも表示されない ・$maxを5にしているのに2つしか表示されない所がある うまくいかない法則がまったくわかりません。 どのようにしたらいいのでしょうか?

    • ベストアンサー
    • CGI