2012-03-18 18 views
1

私は多くのシェルスクリプトでこの行を見てきましたが、その影響についてはわかりません。誰か説明してもらえますか?この行はシェルスクリプトにどのような影響を与えますか?

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$ 
+1

その一部ですか? –

+0

すべてそれです。私はtempfileが何をしているのか正確には分かっていませんが、/ dev/nullへの方向転換を理解していません。 – Sheldon

+0

@Sheldon 'man tempfile'には" tempfileは非推奨です; 'mktemp'(1)代わりに。 – l0b0

答えて

5

一時ファイルを作成し、そのファイルへのパスを$ tempfile変数に入れます。

`tempfile 2>/dev/null` 

tempfileコマンド(man tempfile)を実行し、エラーメッセージを破棄します。成功すると、新しく作成された一時ファイルの名前が返されます。失敗すると、ゼロ以外の値を返します。その場合は、コマンドの次の部分が実行されます。

this || thatの場合、thisが失敗した場合、すなわち0以外を返した場合にのみthatが実行されます。

$$は、シェルのプロセスIDに展開するbashの変数です。 psecho $$の結果を比較してください。tempfile=/tmp/test$$tempfile=/tmp/test2278のように展開されます。

おそらくスクリプトの後半で、何かが$ tempfileに書き込みます。

0

||までの行の最初の部分は、プログラムtempfileを実行し、変数tempfileの標準出力をキャプチャしてエラーを捨てます。正常終了の場合は0、失敗の場合は0以外(実行中にtempfileコマンドを実行しなかったか、tempfileコマンドによって報告された失敗)の終了ステータスもあります。

||は、「LHS(左側)が失敗した場合はRHS(右側)を実行する」を意味します。

したがって、tempfileコマンドに問題があった場合、RHSが使用され、より簡単な一時ファイル名がtempfile(変数)に割り当てられます。

全体的に、それは同等です:

if tempfile=`tempfile 2>/dev/null` 
then : OK 
else tempfile=/tmp/test$$ 
fi 

だけが1行ではなく、4です。

コマンドがマシンに存在するかどうかは、$tempfileで知ることができます。

0

man tempfileを見ましたか?

その行は、tempfile(1)を使用して、一時ファイル名を生成し、$tempfileに格納しようとしています。それが失敗すると( "||"、または "part")、明示的なファイル名/tmp/test$$に戻ります。ここで$$the PID of the executing scriptです。

2

一時ファイルだけ離れてそれをスローを/ dev/nullデバイスにコマンド出力をリダイレクト/tmp/tmp.XXXXXX

2>を/ dev/nullのようなファイル名でtemporayファイルを作成します。このリダイレクトは、一時ファイルを作成する際のエラーを無視するだけです。

|| 2つのコマンドを連鎖させます。最初に失敗した場合は、2番目が実行されます。最初に成功した場合は何も起こりません。

$$は、一時ファイルコマンドが失敗した場合、プロセスのPIDが6052.

3

であれば一時ファイル変数は依然として/ test6052形/ tmpに文字列が含まれることを意味現在のシェルのPIDでありますシェルにはコマンドラインと変数のための別々の名前空間があります(スクリプトラインで悪用されるLisp-2、LOLになります)。 tempfileは、どのような方法でも関係のない変数tempfileの値を計算するために実行されるコマンドです。 tempfileは、一時ファイルの名前として使用するのに適したパス名を生成します。 2> /dev/nullは、すべてのエラーメッセージをtempfileから/dev/null(2は標準エラーファイル記述子)にリダイレクトします。 command1 || command2論理とは、「command1が失敗した場合にcommand2を実行する」ことを意味する。 tempfileから一時的な名前を取得できない場合は、/tmp/test$$を使用します。$$は、シェル独自のプロセスIDに展開される特別な組み込みシェルパラメータです。

関連する問題