多くのシェル スクリプトでこの行を見てきましたが、その効果がわかりません。誰か説明してくれませんか?
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
一時ファイルを作成し、そのファイルへのパスを$tempfile変数に入れます。
`tempfile 2>/dev/null`
tempfileコマンド(man tempfile
)を実行し、エラーメッセージを破棄します。成功すると、新しく作成された一時ファイルの名前が返されます。失敗した場合はゼロ以外の値を返します。その場合、コマンドの次の部分が実行されます。
コマンドの場合、失敗した場合、つまりゼロ以外を返す場合this || that
にthat
のみ実行されます。this
$$
シェルのプロセスIDに展開されるbashの変数です。ps
(との結果を比較しますecho $$
。)したがって、のtempfile=/tmp/test$$
ようなものに展開されますtempfile=/tmp/test2278
。
おそらく、スクリプトの後半で、何かが$tempfileに書き込まれます。
シェルには、スクリプト行で利用されるコマンドと変数用の個別の名前空間があります (Lisp-2、LOL になります)。変数とはまったく関係tempfile
のない変数の値を計算するために実行されるコマンドです。一時ファイルの名前として使用するのに適したパス名を生成します。からエラー メッセージをリダイレクトします( 2 は標準エラー ファイル記述子です)。ロジックは、「command1 が失敗した場合、command2 を実行する」という意味です。から一時的な名前を取得できない場合は、 を使用します。ここで、はシェル自体のプロセス ID に展開される特別な組み込みシェル パラメータです。tempfile
tempfile
2> /dev/null
tempfile
/dev/null
command1 || command2
tempfile
/tmp/test$$
$$
tempfile は、/tmp/tmp.XXXXXX のようなファイル名で一時ファイルを作成します。
2>/dev/null は、コマンド出力を /dev/null デバイスにリダイレクトし、それを破棄します。このリダイレクトは、一時ファイルの作成に関するエラーを無視します。
|| 2 つのコマンドを連結します。1 つ目が失敗すると、2 つ目が実行されます。最初が成功した場合、他には何も起こりません。
$$ は現在のシェルの pid です。つまり、tempfile コマンドが失敗した場合でも、プロセスの pid が 6052 の場合、tempfile 変数には /tmp/test6052 の形式の文字列が含まれます。
行の最初の部分であるまでは||
、プログラムを実行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
あなたは男のtempfileを見ましたか?
その行はtempfile(1)
、一時ファイル名を生成し、それをに格納するために使用しようとしてい$tempfile
ます。それが失敗した場合(「||」、「または」の部分)、明示的なファイル名にフォールバックします。/tmp/test$$
ここで、$$
は実行中のスクリプトのPIDです。