Sentirsi come un idiota in questo momento. Perché questo non funziona?
echo "/some/directory/path" | xargs -n1 cd
Sentirsi come un idiota in questo momento. Perché questo non funziona?
echo "/some/directory/path" | xargs -n1 cd
Risposte:
La pipe esegue xargs in un sottoprocesso e xargs esegue cd in un sottoprocesso. Le modifiche in un sottoprocesso non vengono propagate al processo padre.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Nota che ho aggiunto 'taglia' per dividere gli spazi e afferrare il primo oggetto come fa xargs)
xargs
non può essere eseguito cd
poiché, per necessità, è incorporato nella shell e xargs
può eseguire solo eseguibili indipendenti. Ciò che hai detto è vero sui sottoprocessi, tuttavia.
cd `port file libcudd | sed -e 's/\/Portfile//'`
(di solito quelli lunghi che non vuoi gestire manualmente, come questa posizione del Portfile di MacPorts).
Il comando cd
è incorporato perché le informazioni sulla directory corrente sono legate a un processo e solo la shell incorporata può cambiare la directory corrente della shell in esecuzione.
Esistono due problemi con il codice:
xargs
impossibile eseguire cd
perché cd
è un comando incorporato e xargs
può eseguire solo file eseguibili.cd
un processo secondario chiamato da xargs
, non avrà alcun effetto sul processo padre come spiegato sopra.La soluzione è eseguire una sotto-shell, al suo interno eseguire cd
e quindi è possibile eseguire i comandi nella nuova directory corrente.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
in questo esempio. Dovrebbe passare il valore per $0
, tipoecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'