2015-12-22 11 views
5

が、私はこれを取得:期待と「FOO」がそのまま印刷されてここで

$ FOO=foo 
$ echo $FOO 
foo 
$ echo $$FOO 
11971FOO 

を、$$シェルのPIDに解決されます。

さて、いくつかのスクリプトを理解し、デバッグしようと、私は次を見つける:問題の

#!/bin/bash 
FILE1=/path/to/file/1 
FILE2=/path/to/file/2 
echo $$FILE1 >> $$FILE2 

スクリプトは、Debianパッケージのポストインストールスクリプトに由来します。これは実行する前に前処理を行うことになっていますか?

更新:スクリプトがEPMで構築されており、次のディレクティブを介して読み出さパッケージの一部です:

%postinstall <script.sh 

たdebパッケージでは、にpostinstスクリプトが読み:

#!/bin/bash 
FILE1=/path/to/file/1 
FILE2=/path/to/file/2 
echo $FILE1 >> $FILE2 

したがって、処理はepmまたはdpkgによって行われます。

+0

私にとって、これは名前が既存のものと衝突しないディレクトリを作成する方法のようです。 – fedorqui

+1

これが実際のスクリプトであれば、ほぼ確実に後処理が行われます。しかし、文脈がなくても、確かに言うことは不可能です。 – chepner

+1

Er、前処理済み。 – chepner

答えて

2

と、現在のディレクトリ内のファイル

current_shell_process_id_FILE2 

を追加し続けます。 the documentation引用:リストファイルで指定されたすべてのコマンドがそう必ず、EPMが提供する変数の展開を使用します

注意があなたのコマンドで任意のドル記号($)文字を引用します。たとえば、 "$ foo"は "foo"の値に置き換えられますが、 "$$ foo"は "$ foo"になります。

0

$$は、プロセスIDが11971の場合は印刷します。

あなたはそのechoFOOを持っているので、ちょうどあなたが

11971FOO 

が、それはあなたがセッションを実行 するbashシェルのプロセスIDです正確に取得11971FOOをダンプします。これを確認するには、次のようにします:

kill -9 11971 

これは現在のセッションを終了します。通常の場合の下のスクリプト

#!/bin/bash 
FILE1=/path/to/file/1 
FILE2=/path/to/file/2 
echo $$FILE1 >> $$FILE2 

は前処理を受けません。これは明らかにEPMパッケージングツールの機能であるコンテンツ

current_shell_process_idFILE1 
+10

OPは、' $$ 'がそれ自体で何を意味するのかをすでに知っていることを明確にしました。 –

+0

@TomFenech:私の答えを更新しました。 – sjsam

+0

@sjsamあなたの答えをありがとう。これは分かります。引用符で囲まれた行がpostinstallスクリプトの文脈で何か異なるのかどうか疑問に思っています。 – Jan

関連する問題