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)
xargsnão pode ser executado, cdpois é, necessariamente, um shell embutido e xargssó 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:
xargsnão pode ser executado cdporque cdé um comando interno e xargspode executar apenas arquivos executáveis.cdem 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 cde, 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'