Che cos'è $ () in un comando?


18

Cosa c'è $()nei comandi Shell Linux?

Per esempio:

chmod 777 $(pwd)

1
Nota che non esiste il comando line shell . Esistono numerose applicazioni shell disponibili per Linux.
Stéphane Chazelas,

Risposte:


21

È molto simile ai backtick ''.

Si chiama sostituzione dei comandi ( specifica posix ) e invoca una subshell. Il comando tra parentesi graffe $()o tra i backtick (``) viene eseguito in una subshell e l'output viene quindi inserito nel comando originale.

A differenza dei backtick, il $(...)modulo può essere nidificato. Quindi puoi usare la sostituzione dei comandi all'interno di un'altra sostituzione.

Ci sono anche differenze nella fuga di personaggi all'interno della sostituzione. Preferisco il $(...)modulo.


4
anche i backtick possono essere nidificati. Si noti che i caratteri di nuova riga finali vengono rimossi dall'output del comando.
Stéphane Chazelas,

2
@ StéphaneChazelas come si possono annidare i backtick? Intendi per fuga ecessiva?
caos,

3
Sì: come conecho `echo \`echo foo\`` bar
Stéphane Chazelas il

1
Qualche riferimento ufficiale che dice che i backtick sono deprecati?
vinc17,

1
Trovato questa risposta: unix.stackexchange.com/questions/126927/… sembra che non siano deprecati. Modificata la mia risposta, grazie
caos

5

In POSIX o POSIX come gusci ( ksh, bash, ash, zsh, yash...), è come ``: il comando interno $()viene eseguito e sostituito dal suo standard output. La divisione delle parole e la generazione del nome del file vengono eseguite a meno che non $()siano racchiuse tra virgolette doppie. così

chmod 777 $(pwd)

dovrebbe essere sostituito con:

chmod 777 "$(pwd)"

per evitare la divisione di parole e la generazione di nomi di file sul percorso della directory di lavoro corrente.

O ancora meglio (tranne in alcune shell, come zsh, nel caso in cui la directory sia stata rinominata):

chmod 777 "$PWD"

Since $PWDè una variabile speciale che contiene il percorso della directory di lavoro corrente nelle shell POSIX.

O ancora meglio:

chmod 777 .

Poiché la .voce nella directory corrente è un collegamento reale a quella directory stessa.


2

Questo $()è usato per eseguire un comando principalmente all'interno di altri comandi.

chmod 777 $(pwd)

pwdIl comando fornisce la directory di lavoro corrente. Quindi, quando l'intera operazione viene eseguita, l'output di pwd sostituirà la sua posizione e servirà da argomento chmod, e il risultato è che tutta la tua attuale directory di lavoro ottiene l'autorizzazione 777che immagino non debba mai essere usata nell'ambiente di produzione;).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.