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?
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?
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ę.
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ś?
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).
proba=$(echo $HOME) |cd $proba