it-swarm-eu.dev

Cosa significa $$ nella shell?

Una volta ho letto che un modo per ottenere un nome file univoco in una shell per i file temporanei era utilizzare un doppio simbolo di dollaro ($$). Questo produce un numero che varia di volta in volta ... ma se lo chiami ripetutamente, restituisce lo stesso numero. (La soluzione è usare solo il tempo.)

Sono curioso di sapere che cos'è $$ in realtà, e perché sarebbe suggerito come un modo per generare nomi di file unici.

125
Kitty

In Bash $$ è l'ID di processo, come indicato nei commenti non è sicuro da utilizzare come nome di file temporaneo per una serie di motivi.

Per i nomi di file temporanei, utilizzare il comando mktemp.

85
Joe Skora

$$ è l'ID di processo (PID) in bash. L'uso di $$ è una cattiva idea, perché solitamente creerà una condizione di competizione e consentirà al tuo script di shell di essere sovvertito da un utente malintenzionato. Vedi, per esempio, tutti queste persone che hanno creato file temporanei non sicuri e hanno dovuto emettere avvisi di sicurezza.

Invece, usa mktemp. La pagina man di Linux per mktemp è eccellente. Ecco un esempio di codice da esso:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
102
emk

$$ è l'id del processo corrente.

17
Flint

Ogni processo in un sistema operativo simile a UNIX ha un identificatore univoco (temporaneamente), il PID. Nessuno dei due processi in esecuzione allo stesso tempo può avere lo stesso PID e $$ si riferisce al PID dell'istanza bash che esegue lo script.

Questo è molto non un identificatore unico nel senso che non sarà mai riutilizzato (infatti, i PID vengono riutilizzati costantemente). Quello che ti dà è un numero tale che, se un'altra persona esegue il tuo script, otterrà un identificatore diverso mentre il tuo è ancora in esecuzione. Una volta che il tuo muore, il PID può essere riciclato e qualcun altro potrebbe eseguire il tuo script, ottenere lo stesso PID e quindi ottenere lo stesso nome di file.

Come tale, è davvero sensato dire "$$ dà un nome di file tale che se qualcun altro esegue lo stesso script mentre la mia istanza è ancora in esecuzione, otterranno un nome diverso".

6
Adam Wright

$$ è il tuo PID. In realtà non genera un nome file univoco, a meno che tu non stia attento e nessun altro lo faccia esattamente nello stesso modo. 

Tipicamente dovresti creare qualcosa come/tmp/mioprogramname $$

Ci sono tanti modi per rompere questo, e se stai scrivendo in luoghi che altre persone possono scrivere non è troppo difficile su molti sistemi operativi per prevedere quale PID avrai e girovagare: immagina di essere in esecuzione come root e creo/tmp/yourprogname13395 come link simbolico che punta a/etc/passwd - e tu scrivi in ​​esso.

Questa è una cosa brutta da fare in uno script di Shell. Se stai per usare un file temporaneo per qualcosa, dovresti usare una lingua migliore che ti consenta almeno di aggiungere il flag "esclusivo" per aprire (creare) il file. Quindi puoi stare sicuro che non stai sbavando qualcos'altro.

4
JBB

Lasciatemi la seconda risposta di emk: non utilizzare $$ da solo come qualcosa di "unico". Per i file, usa mktemp. Per altri ID all'interno dello stesso script bash, usa "$$$ (date +% s% N)" per una ragionevolmente buona possibilità di unicità.

 -k
2
Kevin Little

$$ è il pid dell'attuale processo Shell. Non è un buon modo per generare nomi di file unici.

2
leif

$$ è l'id di processo della shell in cui è in esecuzione lo script. Per maggiori dettagli, vedere la pagina man per sh o bash. Le pagine man possono essere trovate sia usando la riga di comando "man sh", sia cercando "web manpage" sul web

2
Shannon Nelson

È l'ID di processo del processo bash. Nessun processo concorrente avrà mai lo stesso PID.

1
Chris

$$ è il pid (id del processo) dell'interprete di Shell che esegue il tuo script. È diverso per ogni processo in esecuzione su un sistema al momento, ma nel tempo il pid si avvolge, e dopo l'uscita ci sarà un altro processo con lo stesso pid alla fine. Finché sei in esecuzione, il pid è unico per te.

Dalla definizione di cui sopra dovrebbe essere ovvio che non importa quante volte si utilizza $$ in uno script, restituirà lo stesso numero. 

Puoi utilizzare, ad es. /tmp/myscript.scratch.$$ come file temporaneo per cose che non devono essere estremamente affidabili o sicure. È buona pratica eliminare tali file temporanei alla fine dello script, usando, ad esempio, il comando trap:

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
1
Arkadiy

Inoltre, è possibile accedere al nome utente di accesso tramite questo comando. Per esempio.

echo $(</proc/$$/login id). After that, you need to use getent command.
0
Obivan