Teraz czuję się jak idiota. Dlaczego to nie działa?
echo "/some/directory/path" | xargs -n1 cd
Teraz czuję się jak idiota. Dlaczego to nie działa?
echo "/some/directory/path" | xargs -n1 cd
Odpowiedzi:
Potok uruchamia xargs w podprocesie, a xargs uruchamia cd w podprocesie. Zmiany w podprocesie nie są propagowane do procesu nadrzędnego.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Zauważ, że dodałem „cut”, aby podzielić na spacje i złapać pierwszy element, tak jak robi to xargs)
xargs
nie można go uruchomić, cd
ponieważ z konieczności jest on wbudowany w powłokę i xargs
może uruchamiać tylko pliki wykonywalne wolnostojące. Jednak to, co powiedziałeś, jest prawdą o podprocesach.
cd `port file libcudd | sed -e 's/\/Portfile//'`
(zwykle długie, których nie chcesz obsługiwać ręcznie, jak na przykład lokalizacja portfela MacPorts).
Polecenie cd
jest wbudowane, ponieważ informacje o bieżącym katalogu są powiązane z procesem i tylko wbudowana powłoka może zmienić bieżący katalog działającej powłoki.
Istnieją dwa problemy z twoim kodem:
xargs
nie można uruchomić, cd
ponieważ cd
jest to wbudowane polecenie i xargs
może uruchamiać tylko pliki wykonywalne.cd
podproces wywoływany z xargs
, nie będzie to miało żadnego wpływu na proces nadrzędny, jak wyjaśniono powyżej.Rozwiązaniem jest uruchomienie podpowłoki, wewnątrz niej uruchom, cd
a następnie możesz wykonywać polecenia w nowym bieżącym katalogu.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
tym przykładzie nie ma sensu . Powinno to mieć wartość $0
, na przykładecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'