2015-12-22 16 views
5

Sulla riga di comando, ottengo questo:

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

Qui, $$ risolve il PID del guscio come previsto e "foo" viene stampato testualmente.

Ora, cercando di capire ed eseguire il debug alcuni script, trovo il seguente:

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

Lo script in questione proviene da uno script di postinstallazione di un pacchetto Debian. Questo dovrebbe essere sottoposto a pre-elaborazione prima che possa funzionare?

Update: Lo script è parte di un pacchetto costruito con EPM e leggere tramite la seguente direttiva:

%postinstall <script.sh 

Nel pacchetto deb risultante, lo script postinst legge:

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

Pertanto, l'elaborazione viene eseguita da epm o dpkg.

+0

Per me, questo è un modo per creare una directory il cui nome non collide con nessuno esistente. – fedorqui

+1

Se si tratta di uno script vero e proprio, è quasi certamente destinato a essere post-elaborato. È impossibile dirlo con certezza, però, senza più contesto. – chepner

+1

Er, preelaborato. – chepner

risposta

2

Questo è apparentemente una caratteristica dello strumento confezione EPM. Citando the documentation:

Si noti che tutti i comandi specificati nel file di lista utilizzeranno l'espansione variabile fornita da EPM, in modo da essere sicuri di citare tutti i caratteri simbolo del dollaro ($) nei vostri comandi. Ad esempio, "$ pippo" viene sostituito dal valore di "pippo", ma "$$ pippo" diventa "$ pippo".

0

$$ stampa l'ID di processo che è 11971 nel tuo caso.

Dal momento che si dispone di un FOO dopo che echo solo discariche FOO dopo 11971 in modo da ottenere

11971FOO 

Per la precisione è l'id del processo della shell bash in cui si esegue il sessione. Per verificare ciò è possibile:

kill -9 11971 

che interromperà la sessione corrente. Lo script seguente in casi normali

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

non subirà alcun pre-elaborazione. Manterrà sulla aggiungendo file

current_shell_process_id_FILE2 

nella directory corrente con il contenuto

current_shell_process_idFILE1 
+10

L'OP ha chiarito che sanno già cosa significa' $$ 'da solo. –

+0

@TomFenech: aggiornata la mia risposta. – sjsam

+0

@sjsam Grazie per la risposta. Lo capisco. Quello che mi chiedo se le virgolette fanno qualcosa di diverso nel contesto di uno script postinstall. – Jan