1

多くのシェル スクリプトでこの行を見てきましたが、その効果がわかりません。誰か説明してくれませんか?

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

5 に答える 5

5

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

`tempfile 2>/dev/null`

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

コマンドの場合、失敗した場合、つまりゼロ以外を返す場合this || thatthatのみ実行されます。this

$$シェルのプロセスIDに展開されるbashの変数です。ps(との結果を比較しますecho $$。)したがって、のtempfile=/tmp/test$$ようなものに展開されますtempfile=/tmp/test2278

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

于 2012-03-18T16:36:44.313 に答える
3

シェルには、スクリプト行で利用されるコマンドと変数用の個別の名前空間があります (Lisp-2、LOL になります)。変数とはまったく関係tempfileのない変数の値を計算するために実行されるコマンドです。一時ファイルの名前として使用するのに適したパス名を生成します。からエラー メッセージをリダイレクトします( 2 は標準エラー ファイル記述子です)。ロジックは、「command1 が失敗した場合、command2 を実行する」という意味です。から一時的な名前を取得できない場合は、 を使用します。ここで、はシェル自体のプロセス ID に展開される特別な組み込みシェル パラメータです。tempfiletempfile2> /dev/nulltempfile/dev/nullcommand1 || command2tempfile/tmp/test$$$$

于 2012-03-18T16:39:28.793 に答える
2

tempfile は、/tmp/tmp.XXXXXX のようなファイル名で一時ファイルを作成します。

2>/dev/null は、コマンド出力を /dev/null デバイスにリダイレクトし、それを破棄します。このリダイレクトは、一時ファイルの作成に関するエラーを無視します。

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

$$ は現在のシェルの pid です。つまり、tempfile コマンドが失敗した場合でも、プロセスの pid が 6052 の場合、tempfile 変数には /tmp/test6052 の形式の文字列が含まれます。

于 2012-03-18T16:39:19.323 に答える
0

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

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

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

全体として、次のようになります。

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

それだけが4行ではなく1行にあります。

アイデアは、確かに、コマンドがマシンに存在する$tempfileかどうかで何かを取得することです。tempfile

于 2012-03-18T16:37:43.247 に答える
0

あなたは男のtempfileを見ましたか?

その行はtempfile(1)、一時ファイル名を生成し、それをに格納するために使用しようとしてい$tempfileます。それが失敗した場合(「||」、「または」の部分)、明示的なファイル名にフォールバックします。/tmp/test$$ここで、$$実行中のスクリプトのPIDです

于 2012-03-18T16:37:58.347 に答える