Sentindo-me como um idiota agora. Por que isso não funciona?
echo "/some/directory/path" | xargs -n1 cd
O canal executa xargs em um subprocesso e xargs executa cd em um subprocesso. Alterações em um subprocesso não são propagadas para o processo pai.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Note que eu adicionei 'cut' para dividir em espaços e pegue o primeiro item a forma como xargs faz)xargs
não pode ser executado,cd
pois é, necessariamente, um shell embutido exargs
só pode executar executáveis independentes. O que você disse é verdade sobre subprocessos, no entanto.cd `port file libcudd | sed -e 's/\/Portfile//'`
(geralmente os longos que você não deseja manipular manualmente, como este local do MacPorts Portfile).O comando
cd
é interno porque as informações sobre o diretório atual estão vinculadas a um processo e apenas o shell interno pode alterar o diretório atual do shell em execução.Há dois problemas com seu código:
xargs
não pode ser executadocd
porquecd
é um comando interno exargs
pode executar apenas arquivos executáveis.cd
em um subprocesso chamado fromxargs
, ele não terá nenhum efeito no processo pai, conforme explicado acima.A solução é executar um sub-shell, dentro dele, executar
cd
e, em seguida, você pode executar comandos no novo diretório atual.fonte
ls | xargs ...
neste exemplo. Deveria estar passando o valor para$0
, como #echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'