2013-08-13 20 views
29

ho pensato che avrei capito tubi * nix fino ad ora ... ho un eseguibile chiamato studio che link simbolici alla mia installazione di Android Studio e avevo assunto ho potuto ottenere il legato-a posizione conpipe Unix in ls

which studio | ls -l 

Ma questo non funziona. Quello che mi dà è equivalente a aver appena eseguito ls -l nella directory corrente.

Se corro , ottengo /home/me/bin/studio. E se corro ls -l /home/me/bin/studio ottengo l'output atteso mostrandomi la posizione del link simbolico.

Quindi perché la versione con conduttura non funziona? Cosa non ho borbottato sui tubi?

risposta

42

Per fare questo è necessario xargs:

which studio | xargs ls -l 

Da man xargs:

xargs - creare ed eseguire righe di comando dallo standard input

Per comprendere appieno come funzionano i tubi, puoi leggere What is a simple explanation for how pipes work in BASH?:

Una pipe Unix collega il descrittore di file STDOUT (output standard) di il primo processo allo STDIN (input standard) del secondo. Ciò che accade con lo è che quando il primo processo scrive sul suo STDOUT, quell'output può essere immediatamente letto (da STDIN) dal secondo processo.

16

ls non legge gli argomenti dallo standard input, ma dalla riga di comando. Per ottenere la directory nella riga di comando, è necessario utilizzare la sostituzione di comando:

ls -l "$(which studio)" 

(Le doppie virgolette sono necessarie se il percorso potrebbe contenere spazi bianchi.)

+1

La risposta che implica 'xargs' è più pulita, ma questo onora il codice colore della mia shell, che è un bel vantaggio! – Dannid

1

Dal ls -l non prende alcun input, è non fa nulla per quanto riguarda l'output di which studio. La cosa importante qui è capire la differenza tra input standard e argomenti. Lo standard input è un file speciale che viene letto utilizzando la procedura scanf (ad esempio da un programma in C) e gli argomenti relativi a un programma vengono passati alla procedura principale come parametri argv e argc. argv è una matrice di matrici terminate da null di char e argc è la lunghezza di tale matrice.