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 usare 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 cosa sia in realtà $$ , e perché sarebbe suggerito come un modo per generare nomi di file unici.

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

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

$$ è l’ID del processo (PID) in bash. L’utilizzo di $$ è una ctriggers idea, perché di solito crea una condizione di competizione e consente al tuo script di shell di essere sovvertito da un utente malintenzionato. Vedi, per esempio, tutte 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 

$$ è l’id del processo corrente.

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 $$ fa riferimento al PID dell’istanza di bash che esegue lo script.

Questo non è un idenifier unico nel senso che non sarà mai riutilizzato (infatti, le PID vengono riutilizzate 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, otterrà un nome diverso”.

$$ è 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 hai intenzione di fare e girarti: 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 essere certo che non stai sbavando qualcos’altro.

$$ è il pid del processo di shell corrente. Non è un buon modo per generare nomi di file unici.

$$ è 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 usando la riga di comando “man sh”, o cercando sul web “shell manpage”

Lasciami la seconda risposta di emk: non usare $$ 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 ragionevole possibilità di unicità.

  -k 

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

$$ è il pid (id del processo) dell’interprete della shell che esegue il tuo script. È diverso per ogni processo eseguito su un sistema al momento, ma col passare del 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 usare, ad esempio /tmp/myscript.scratch.$$ come file temporaneo per cose che non devono essere estremamente affidabili o sicure. È buona pratica eliminare tali file temporanei alla fine del tuo script, usando, ad esempio, il comando trap:

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

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

 echo $(