Eu não entendo muito bem como os tubos funcionam no bash.
Eu sei que é preciso uma saída de um comando como a entrada em outro comando.
Que saída posso obter, porque é o que o comando imprime na tela.
Mas como sei que entrada um comando receberá?
Aqui está um exemplo que eu pensei que iria funcionar:
which gem | rm
Infelizmente não.
Qual gema é impressa para /usr/bin/gem
que a saída seja correta?
Eu pensei que isso foi dado à empresa, então seria, rm /usr/bin/gem
mas eu estava errado.
Portanto, minha pergunta é: como sei que entrada um comando recebe?
rm /usr/bin/gem
é uma péssima ideia. Deixe issogem
(e Ruby intérprete ele vai com) sozinho e instalar o interpretador Ruby preferencial (egem
) usandorvm
: rvm.beginrescueend.comRespostas:
"Entrada" e "argumentos da linha de comando" são coisas diferentes.
rm
remove os arquivos fornecidos como argumentos.Um canal redireciona a saída do comando à esquerda para a entrada do comando à direita. Não afeta os argumentos de linha de comando do programa à direita.
Para fazer o que você está tentando fazer, tente usar
xargs
a conversão de entrada padrão em argumentos de linha de comando para executar um programa. Esse é o seu trabalho.which gem | xargs rm
, por exemplo, removerá ogem
em seu PATH.fonte
rm
não aceita entrada, requer argumentos. Estes são diferentes. Os argumentos são as opções e nomes de arquivos e assim por diante que você fornece a um programa na linha de comando para afetar seu comportamento. Entrada são os dados em que o programa trabalha. Por exemplo,grep
usa entrada e argumentos:Existem dois argumentos lá
"foo"
efile.txt
. A entrada é o conteúdo defile.txt
, não a sequência emfile.txt
si. Como o grep recebe entrada, você pode usá-lo com pipes:produz a mesma saída, pois cat está usando
file.txt
como argumento e produzindo o conteúdo defile.txt
como saída. Essa saída é canalizada para grep, dando o mesmo efeito que o grep abra o próprio arquivo, como no primeiro exemplo.Se você deseja usar a saída de um programa como argumento para outro, use backticks:
ou esta sintaxe alternativa (específica do bash):
Editar: ou
xargs
como outro respondente aponta. Muitas maneiras de esfolar um gato com uma linha de comando.fonte
cat file.txt | grep "foo"
pode ser centenas de vezes mais lento quegrep "foo" file.txt
.grep --help
há uma rápida visão geral dos argumentos aceitos.Confira as
man
páginas de comandos nos quais você está interessado. Esses programas indicam que eles lêemstdin
(tenteman grep
um comando popular que leia stdin).fonte
man grep | grep 'standard input'
e conseguiIf no file arguments are specified, the standard input is used.
a última partida. Eu tive quegrep
provar um pouco do seu próprio remédio. 😎Tudo isso é perigoso para executar se você tiver um diretório no PATH que contenha espaço ou se o nome do comando contiver espaço:
O GNU Parallel http: // www.gnu.org/software/parallel/ não tem esse problema, portanto isso funcionará mesmo se você tiver um diretório no PATH que contenha espaço ou se o nome do comando contiver espaço:
Assista ao vídeo de introdução do GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
fonte