Nie do końca rozumiem, jak rury działają w trybie bash.
Wiem, że pobiera dane wyjściowe z jednego polecenia jako dane wejściowe w innym poleceniu.
Co mogę uzyskać, ponieważ to polecenie wypisuje na ekran.
Ale skąd mam wiedzieć, jakie dane wprowadzi polecenie?
Oto przykład, który moim zdaniem powinien zadziałać:
which gem | rm
Niestety tak nie było.
Który klejnot jest drukowany, /usr/bin/gem
więc musi być poprawnie wydrukowany?
Myślałem, że to zostało przekazane rm, więc będzie, rm /usr/bin/gem
ale się myliłem.
Więc moje pytanie brzmi: skąd mam wiedzieć, jaki wkład przyjmuje polecenie?
rm /usr/bin/gem
to okropny pomysł. Zostaw togem
(i tłumacz Ruby, z którym idzie) w spokoju i zainstaluj preferowanego tłumacza (igem
) Ruby, używającrvm
: rvm.beginrescueend.comOdpowiedzi:
„Dane wejściowe” i „argumenty wiersza poleceń” to różne rzeczy.
rm
usuwa pliki podane jako argumenty.Potok przekierowuje wyjście polecenia po lewej stronie na wejście polecenia po prawej stronie. Nie wpływa na argumenty wiersza poleceń programu po prawej stronie.
Aby zrobić to, co próbujesz zrobić, spróbuj
xargs
przekonwertować standardowe dane wejściowe na argumenty wiersza polecenia służące do wykonania programu. To jest jego praca.which gem | xargs rm
, na przykład, usuniegem
w twojej ŚCIEŻCE.źródło
rm
nie przyjmuje danych wejściowych, wymaga argumentów. Te są różne. Argumenty to przełączniki i nazwy plików itd., Które podajesz programowi w wierszu poleceń, aby wpłynąć na jego zachowanie. Dane wejściowe to dane, na których program działa. Na przykładgrep
bierze zarówno argumenty wejściowe, jak i argumenty:Istnieją dwa argumenty
"foo"
ifile.txt
. Wejście jest zawartość zfile.txt
, a nie ciągfile.txt
samego. Ponieważ grep pobiera dane wejściowe, możesz używać go z potokami:wytworzy, ponieważ kot bierze
file.txt
jako argument i produkcji treści ofile.txt
jak wyjście. Dane wyjściowe są następnie przesyłane do grep, dając taki sam efekt jak otwarcie grep samego pliku, jak w pierwszym przykładzie.Jeśli chcesz użyć danych wyjściowych jednego programu jako argumentu dla innego, użyj odwrotnych znaków:
lub ta alternatywna (specyficzna dla bash) składnia:
Edycja: lub
xargs
jak wskazuje inny odpowiadający. Wiele sposobów na skórowanie kota za pomocą wiersza poleceń.źródło
cat file.txt | grep "foo"
może być setki razy wolniejszy niżgrep "foo" file.txt
.grep --help
szybki przegląd przyjętych argumentów.Sprawdź
man
strony poleceń, które Cię interesują. Programy te wskażą, że czytająstdin
(wypróbujman grep
popularne polecenie, które czyta standardowe wejście).źródło
man grep | grep 'standard input'
i dostałem sięIf no file arguments are specified, the standard input is used.
jako ostatni mecz. Had Musiałemgrep
trochę posmakować własnego leku. 😎Wszystkie są niebezpieczne do uruchomienia, jeśli w katalogu PATH znajduje się katalog zawierający spację lub jeśli nazwa polecenia zawiera spację:
GNU Parallel http: // www.gnu.org/software/parallel/ nie ma tego problemu, więc zadziała to nawet wtedy, gdy w katalogu PATH znajduje się katalog zawierający spację lub jeśli nazwa polecenia zawiera spację:
Obejrzyj wideo wprowadzające do GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
źródło