私は多くのシェルスクリプトでこの行を見てきましたが、その影響についてはわかりません。誰か説明してもらえますか?この行はシェルスクリプトにどのような影響を与えますか?
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
私は多くのシェルスクリプトでこの行を見てきましたが、その影響についてはわかりません。誰か説明してもらえますか?この行はシェルスクリプトにどのような影響を与えますか?
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
一時ファイルを作成し、そのファイルへのパスを$ tempfile変数に入れます。
`tempfile 2>/dev/null`
tempfileコマンド(man tempfile
)を実行し、エラーメッセージを破棄します。成功すると、新しく作成された一時ファイルの名前が返されます。失敗すると、ゼロ以外の値を返します。その場合は、コマンドの次の部分が実行されます。
this || that
の場合、this
が失敗した場合、すなわち0以外を返した場合にのみthat
が実行されます。
$$
は、シェルのプロセスIDに展開するbashの変数です。 ps
とecho $$
の結果を比較してください。tempfile=/tmp/test$$
はtempfile=/tmp/test2278
のように展開されます。
おそらくスクリプトの後半で、何かが$ tempfileに書き込みます。
||
までの行の最初の部分は、プログラム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
で知ることができます。
man tempfileを見ましたか?
その行は、tempfile(1)
を使用して、一時ファイル名を生成し、$tempfile
に格納しようとしています。それが失敗すると( "||"、または "part")、明示的なファイル名/tmp/test$$
に戻ります。ここで$$
はthe PID of the executing scriptです。
一時ファイルだけ離れてそれをスローを/ dev/nullデバイスにコマンド出力をリダイレクト/tmp/tmp.XXXXXX
2>を/ dev/nullのようなファイル名でtemporayファイルを作成します。このリダイレクトは、一時ファイルを作成する際のエラーを無視するだけです。
|| 2つのコマンドを連鎖させます。最初に失敗した場合は、2番目が実行されます。最初に成功した場合は何も起こりません。
$$は、一時ファイルコマンドが失敗した場合、プロセスのPIDが6052.
であれば一時ファイル変数は依然として/ test6052形/ tmpに文字列が含まれることを意味現在のシェルのPIDでありますシェルにはコマンドラインと変数のための別々の名前空間があります(スクリプトラインで悪用されるLisp-2、LOLになります)。 tempfile
は、どのような方法でも関係のない変数tempfile
の値を計算するために実行されるコマンドです。 tempfile
は、一時ファイルの名前として使用するのに適したパス名を生成します。 2> /dev/null
は、すべてのエラーメッセージをtempfile
から/dev/null
(2は標準エラーファイル記述子)にリダイレクトします。 command1 || command2
論理とは、「command1が失敗した場合にcommand2を実行する」ことを意味する。 tempfile
から一時的な名前を取得できない場合は、/tmp/test$$
を使用します。$$
は、シェル独自のプロセスIDに展開される特別な組み込みシェルパラメータです。
その一部ですか? –
すべてそれです。私はtempfileが何をしているのか正確には分かっていませんが、/ dev/nullへの方向転換を理解していません。 – Sheldon
@Sheldon 'man tempfile'には" tempfileは非推奨です; 'mktemp'(1)代わりに。 – l0b0