Como encadear comandos, ou seja, fazer a saída de um comando se tornar a entrada de outro?
basename | dirname /dev/null
Saída Esperada:
dev
Saída real:
usage: basename string [suffix]
basename [-a] [-s suffix] string [...]
/dev
Também tentei o seguinte, mas também não funcionou:
dirname /dev/null | basename
Deveria ser:
Embora para caminhos de arquivo arbitrários onde você não pode garantir que os componentes do caminho não comecem com
-
, você precisa adicionar alguns--
s para marcar o fim das opções:$(...)
pode ser usado para executar um comando e coletar saída para ser usado como um parâmetro de linha de comando para outro programa.Esteja ciente de que, uma vez que
$(...)
remove todos os caracteres de nova linha à direita da saída dos comandos, o acima ainda não funciona para caminhos de arquivo arbitrários; no exemplo acima, aqueles cujo dirname termina em caracteres de nova linha. Contornar isso, embora possível, é doloroso o suficiente para que o problema geralmente seja ignorado.No shell zsh, pode-se usar modificadores de estilo csh para obter o
t
ail (basename) ouh
ead (dirname) de arquivos que não apresentam o problema:Esses modificadores também estão disponíveis em
vim
. Eles também estão disponíveis embash
, mas apenas para expansão de histórico, não para expansão de parâmetros como em csh ou zsh.