2017-01-14 11 views
0

スクリプトを編集していたため、スクリプトが少し長くなったので、スクリプトの主要部分を中括弧で囲み、出力をログファイルコマンドのための個々のログリダイレクトを持っています。次に、スクリプトの実行中のコピーをチェックするコマンドブロックが、中括弧で囲まれているかどうかによって2つの異なる結果が得られることに気付きました。bashスクリプト内の中括弧でコマンドを実行したときの結果が異なる

私は、スクリプトを実行します。

$ /bin/bash scriptname.bash

同じコマンドブロックは、2つの異なる結果を返し、括弧内のコマンドブロックの仕事を持つことが可能であるならば、なぜ私の質問はあります。

は、以下のコマンドブロックである:

#!/bin/bash 
#set -x # Uncomment to debug this shell script 
# 
########################################################## 
#   DEFINE FILES AND VARIABLES HERE 
########################################################## 
THIS_SCRIPT=$(basename $0) 
TIMESTAMP=$(date +%Y-%m-%d_%H%M%S) 
LOGFILE=process_check_$TIMESTAMP.log 

########################################################## 
#    BEGINNING OF MAIN 
########################################################## 

{ 
printf "%s\n" "Checking for currently runnning versions of this script" 

MYPID=$$ # Capture this scripts PID 
MYOTHERPROCESSES=$(ps -ef | \grep $THIS_SCRIPT | \grep -v $MYPID | \grep -v grep | awk '{print $2}') 

if [[ "$MYOTHERPROCESSES" != "" ]] 
    then 
    printf "%s\n" "ERROR: Another version of this script is running...exiting!" 
    exit 2 
    else 
    printf "%s\n" "No other versions running...proceeding" 
fi 

printf "%s\n" "Doing some script stuff..." 
exit 0 

} | tee -a $LOGFILE 2>&1 
# End of script 
+0

pidofまたはpgrepを使用し、ps | grep -v grepのような構造を避けますか?あなたは結果を表示することができますか、多分diffをしてください。 – Klaus

+0

サイドノート:標準出力_and_エラーの両方をログに記録する場合、stderrのリダイレクションはパイプの前で発生する必要があります(またはパイプに '|&'を使用する必要があります)。 –

+0

@Klaus - 中括弧の中にあるブロックには、実行中の別のスクリプトがあることが示されています。中括弧の外側では、ブロックは他のコピーが実行されていないことを正しく評価します。 – martin

答えて

1

これは、中括弧によるものではない、これはパイプによるものです。

コマンドをcommand | teeのようなパイプと組み合わせると、パイプの各側が別のサブプロセスで実行されます。したがって、シェルコマンドはサブシェルで実行されます。これはあなたが検出するこのサブシェルです。

PS:あなたの出力が異なっている何の代わりに

+0

清算していただきありがとうございます。私は、PIDSがピックされたコマンドの数によって異なるので、サブシェルの詐欺があったと推測しました。私には 'pidof'と' pgrep'の使用をお勧めします。 さらに、2つの変数MYPIDとMYOTHERPROCESSESを中括弧の外側に移動し、残りの変数と一緒に束ねるだけで十分だと思います。 – martin

+0

@martin中括弧内のコードは、サブシェルで実行されます。変数に加えた変更は、中括弧の外側には表示されません。現在のシェルの中括弧の中でコードを実行するには、 '| '2>&1'(btw、' 2>&1'はコードのパイプの前に置かれていたはずです) – xhienne

+0

の '2> &1 'ビットあなたのスポットです - これは私の元のスクリプトが上記の提出で私の間違いである方法です。中括弧内のスクリプトの残りの部分は、以前に宣言された変数で異なる条件をテストするだけです。このように私はテストが別のシェルになってうれしいです。しかし、私は期待どおりの結果を得るために、中括弧の中と外に別々に各ブロックを再テストします。 お時間を頂きありがとうございます。 – martin

関連する問題