Se um programa recebe sua entrada de stdin
ou como argumentos de linha de comando depende do designer. Ambas as abordagens têm seus méritos. Para programas que operam estritamente em arquivos, no entanto, geralmente é mais conveniente passar os nomes de arquivos como argumentos de linha de comando, em vez de usar stdin
.
A razão mais óbvia é que o caso comum, o de simplesmente executar um programa em um arquivo, é mais fácil de digitar: readlink file
em vez de echo file | readlink
.
Um problema mais sutil é a correção. O problema é que quando os nomes de arquivos são passados através de stdin
, o programa precisa ser capaz de distinguir um nome de arquivo de outro. Geralmente, isso é feito presumindo-se que os nomes dos arquivos sejam separados por espaço em branco ou por novas linhas, mas isso é incorreto, pois os nomes dos arquivos podem incluir espaços em branco. Uma maneira melhor é separar os nomes de arquivos com bytes nulos, mas pode ser inconveniente gerar uma lista de arquivos separados por nulos.
Passar nomes de arquivos na linha de comando evita esse problema porque o shell manipula toda a análise e cotação do programa. Você pode digitar touch $'foo\nbar'
e touch
corretamente como um nome de arquivo contendo uma nova linha, sem precisar manipular nenhuma análise especial ou citá-la.
Tudo isso dito, se você gostaria de passar arquivos através de stdin
para um programa em particular, você pode. É para isso que o xargs
é. xargs
permite pegar um programa que aceita apenas argumentos na linha de comando e, em vez disso, fazer com que ele leve seus argumentos por stdin
.
Em outras palavras, permite fazer isso: which my_script | xargs readlink
.
Se você quisesse sempre fazer readlink
funcionar dessa maneira, poderia criar um alias: alias readlink="xargs readlink"
. Isso permitiria digitar which my_script | readlink
, como você queria originalmente.