Teraz czuję się jak idiota. Dlaczego to nie działa?
echo "/some/directory/path" | xargs -n1 cd
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ę ixargs
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 ixargs
może uruchamiać tylko pliki wykonywalne.cd
podproces wywoływany zxargs
, 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.źródło
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'