GNU/Linux >> Linux Esercitazione >  >> Linux

Cos'è esattamente <() in bash (e =() in zsh)?

Questo si chiama sostituzione del processo.

Il <(list) la sintassi è supportata da entrambi, bash e zsh . Fornisce un modo per passare l'output di un comando (list ) a un altro comando quando si usa una pipe (| ) non è possibile. Ad esempio quando un comando semplicemente non supporta l'input da STDIN oppure hai bisogno dell'output di più comandi:

diff <(ls dirA) <(ls dirB)

<(list) connette l'output di list con un file in /dev/fd , se supportato dal sistema, altrimenti viene utilizzata una named pipe (FIFO) (che dipende anche dal supporto del sistema; nessuno dei due manuali dice cosa succede se entrambi i meccanismi non sono supportati, presumibilmente si interrompe con un errore). Il nome del file viene quindi passato come argomento sulla riga di comando.

zsh supporta inoltre =(list) come possibile sostituto di <(list) . Con =(list) viene utilizzato un file temporaneo invece del file in /dev/fd o un FIFO. Può essere utilizzato in sostituzione di <(list) se il programma deve cercare nell'output.

Secondo il manuale ZSH potrebbero esserci anche altri problemi con come <(list) funziona:

Il = è utile sia come /dev/fd e l'implementazione della named pipe di <(...) avere degli svantaggi. Nel primo caso, alcuni programmi potrebbero chiudere automaticamente il descrittore di file in questione prima di esaminare il file sulla riga di comando, in particolare se ciò è necessario per motivi di sicurezza, ad esempio quando il programma sta eseguendo setuid. Nel secondo caso, se il programma non apre effettivamente il file, la subshell che tenta di leggere o scrivere nella pipe si bloccherà (in un'implementazione tipica, diversi sistemi operativi possono avere un comportamento diverso) per sempre e dovrà essere terminata in modo esplicito . In entrambi i casi, la shell fornisce effettivamente le informazioni utilizzando una pipe, in modo che i programmi che si aspettano di eseguire lseek (vedere la pagina man lseek(2) ) sul file non funzionerà.


Nota, questa è una risposta bash, non zsh.

Ci sono casi in bash in cui non puoi usare pipe:

some_command | some_other_command

poiché le pipe introducono subshell per ogni componente della pipeline, quando le subshell escono, qualsiasi effetto collaterale su cui si faceva affidamento scomparirebbe. Ad esempio, questo esempio artificioso:

cat file | while read line; do ((count++)); done
echo $count

visualizzerà una riga vuota, perché $count variabile non esiste nella shell corrente.

Una sostituzione del processo bash ti consente di evitare questo enigma permettendoti di leggere dall'output "some_command" come faresti da un file

while read line; do ((count++)); done < <(cat file)
# ....................................1.2
echo $count   # the variable *does* exist in the current shell

(1) è un normale reindirizzamento dell'input. (2) è l'inizio del <() sintassi di sostituzione del processo.


Linux
  1. Cosa succede esattamente quando eseguo un file nella shell?

  2. Il Bash '?

  3. Cosa significano -s e [[]] in una condizione if in Bash?

  4. Che cos'è SUID, SGID e Sticky bit?

  5. trova e copia il file usando Bash

Comando file Linux:cosa fa e come usarlo

Comando Ls in Linux (Elenca file e directory)

Cos'è Zsh? Dovresti usarlo?

Cosa sono la pagina mappata in memoria e la pagina anonima?

Cos'è un file .sh?

Cos'è `S_ISREG()` e cosa fa?