Potokowanie poleceń w powłoce


(czosnek17) #1

Chcę zmienić bieżący katalog na domowy, ale żeby nie było za łatwo to z użyciem potoku. Robię tak:

echo $HOME | cd

i nie działa. Dlaczego?


(nintyfan) #2

Powinno być raczej:

cd `echo $HOME`

To nie jest to, czego oczekujesz, lecz jest trudniejsze i działa.

 

Twój przykład nie działa dlatego, bo parametry polecenia to nie są dane z potoku. Wiele poleceń pozwala co prawda na wskazanie ścieżki do pliku, zamiast użycia potoku, ale nie tutaj.

 

Nie będzie także działać metoda z xargs, jako iż cd jest poleceniem wbudowanym w powłokę, chyba że odpalisz nową powłokę.


(czosnek17) #3

Ok, ale o co chodzi z tymi parametrami że nie są to dane z potoku? Że cd nie przyjmuje z potoku? Jeżeli tak, to dlatego, że jest wbudowany w powłokę? I jak działa (dlaczego) to polecenie które podałeś?


(nintyfan) #4
cd `echo $HOME`

Działa poprzez utworzenie podpowłoki, wykonanie w niej echo $HOME, a dane wysłane na ekran są użyte jako parametr. W przypadku potoku dane wysłane na ekran lecą do potoku.

 

Różnice są takie, że w przypadku tworzenia podpowłoki, jak podałem, polecenie echo $HOME musi zostać zakończone, a długość danych w parametrach jest ograniczona. Potoki natomiast pozwalają zrównoleglić pracę i przesyłać dowolną ilość danych(jeśli bufor się zapełni, to polecenie wysyłające dane zostaje wstrzymane do czasu odczytu danych z bufora).


#5

proba=$(echo $HOME) |cd $proba