2013-08-13 15 views
29

Myślałem zrozumiałem * nix rur aż do teraz ... Mam plik wykonywalny o nazwie studio których dowiązania symboliczne do mojej instalacji z Android Studio i przypuszczałem mogę dostać połączony do lokalizacji zUnix rury do ls

which studio | ls -l 

Ale to nie działa. To, co mi daje, jest równoznaczne z uruchomieniem ls -l w bieżącym katalogu.

Jeśli uruchomię which studio, otrzymam /home/me/bin/studio. I jeśli uruchomię ls -l /home/me/bin/studio otrzymam oczekiwany wynik pokazujący lokalizację dowiązania symbolicznego.

Dlaczego więc nie działa wersja przewodowa? Czego nie pytałem o fajki?

Odpowiedz

42

Aby to zrobić trzeba xargs:

which studio | xargs ls -l 

Od man xargs:

xargs - budowanie i wykonywanie wierszy polecenia ze standardowego wejścia

Aby w pełni zrozumieć, jak działają rury, możesz przeczytać What is a simple explanation for how pipes work in BASH?:

Rurka Unix łączy deskryptor pliku STDOUT (standardowe wyjście) z pierwszym procesem ze STDIN (standardowe wejście) drugiego. Co dzieje się wtedy, gdy pierwszy proces zapisuje do STDOUT, to wyjście może być natychmiast odczytane (ze STDIN) przez drugi proces.

16

ls nie odczytuje swoich argumentów ze standardowego wejścia, ale z wiersza poleceń. Aby dostać się do katalogu w linii poleceń, trzeba użyć podstawienia polecenia:

ls -l "$(which studio)" 

(podwójne cudzysłowy są potrzebne, jeśli ścieżka może zawierać spacji).

+1

Odpowiedź z 'xargs' jest czystsza, ale to honoruje kodowanie kolorów mojej powłoki, co jest miłym dobrodziejstwem! – Dannid

1

Od ls -l nie podejmie żadnych danych, to nie robi nic na wyjściu z which studio. Ważną rzeczą jest tutaj zrozumienie różnicy pomiędzy standardowym wejściem i argumentami. Standardowym wejściem jest specjalny plik, który jest odczytywany za pomocą procedury scanf (np. Przez program w C), a argumenty programu są przekazywane do głównej procedury jako parametry argv i argc. argv to tablica zakończonych znakiem NUL tablic znaków char, a argc to długość tej tablicy.