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
bar
no terminal, ele direciona parafoo
como entrada. - em vez de levar entrada para
foo
do 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
cd
e, sempre quecd
aceita entrada durante a execução, recebe essa entrada da saída detail -n 1 ~/mloc
. -
cd
nunca 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
cd
e podemos canalizar decd
; por exemplo, executecd blah 2>&1 | less
; Seblah
nã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 ~/mloc
e captura sua saída. - Em vez de exibir a saída, cria um comando que consiste em anexá-la a
cd
. - Executa esse comando.