Sentindo-me como um idiota agora. Por que isso não funciona?
echo "/some/directory/path" | xargs -n1 cd
Sentindo-me como um idiota agora. Por que isso não funciona?
echo "/some/directory/path" | xargs -n1 cd
Respostas:
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 e xargs
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 executado cd
porque cd
é um comando interno e xargs
pode executar apenas arquivos executáveis.cd
em um subprocesso chamado from xargs
, 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.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
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'