Pipar para um processo envia dados para ele no lugar do que você digitaria após ter lançado o processo, não o que você digitaria como parte do comando que inicia o processo.
( cd também não é um processo, mas isso é menos importante, eu o abordo abaixo.)
Piping anexa a saída de um comando à entrada de outro comando . Considere:
foo | bar
Isso executa bar , executa foo e:
- em vez de mostrar a saída de
barno terminal, ele direciona parafoocomo entrada. - em vez de levar entrada para
foodo terminal , ele sai da saída debar.
(Ambos os pontos realmente expressam a mesma coisa.)
Então, o que acontece quando você executa tail -n 1 ~/mloc | cd ?
- Ele executa
cde, sempre quecdaceita entrada durante a execução, recebe essa entrada da saída detail -n 1 ~/mloc. -
cdnunca aceita entrada durante a execução.
Veja fluxos padrão (Wikipedia) para obter mais informações sobre o significado preciso de entrada e saída nesta resposta. (Aqui, por entrada, quero dizer "entrada padrão" e por saída quero dizer "saída padrão".)
Há também o problema de que cd não é, na verdade, um programa, mas um shell embutido, portanto, quando você executa cd , nenhum novo processo é iniciado. Mas isso não é realmente porque o que você está tentando não funciona, porque:
- O uso de pipes para passar argumentos de linha de comando, como você está tentando, nunca funcionará em nenhum programa.
-
Não há razão para que um shell não possa ser escrito para acomodar pipes a um shell embutido, considerando que eles acomodam pipes de shell builtins.
Note que, às vezes, quando você usa um shell embutido como se fosse um programa real, o que acontece é que o programa real com o mesmo nome é executado. Mas não há programa separado para
cde podemos canalizar decd; por exemplo, executecd blah 2>&1 | less; Seblahnão existir ou não for um diretório, você poderá visualizar o erro emless.
Por fim, considere o que é diferente sobre cd $(tail -n 1 ~/mloc) . Este comando:
- Executa
tail -n 1 ~/mloce captura sua saída. - Em vez de exibir a saída, cria um comando que consiste em anexá-la a
cd. - Executa esse comando.