Je ne comprends pas très bien comment fonctionnent les pipes en bash.
Je sais qu'il faut une sortie d'une commande comme entrée dans une autre commande.
Je peux obtenir une sortie car c'est ce que la commande imprime à l'écran.
Mais comment savoir quelle entrée une commande prendra?
Voici un exemple que je pensais fonctionner:
which gem | rm
Malheureusement non.
Quelle gemme s'imprime /usr/bin/gem
donc ça doit être le bon résultat?
Je pensais que cela avait été donné à RM, donc ce serait le cas, rm /usr/bin/gem
mais j'avais tort.
Donc ma question est, comment puis-je savoir quelle entrée prend une commande?
rm /usr/bin/gem
c'est une idée terrible . Laissez celagem
(et l'interpréteur Ruby qui va avec) seul et installez votre interprète Ruby préféré (etgem
) en utilisantrvm
: rvm.beginrescueend.comRéponses:
"Input" et "command line arguments" sont des choses différentes.
rm
supprime les fichiers fournis comme arguments.Un canal redirige la sortie de la commande de gauche vers l'entrée de la commande de droite. Cela n'affecte pas les arguments de ligne de commande du programme de droite.
Pour faire ce que vous essayez de faire, essayez d'utiliser
xargs
pour convertir l'entrée standard en arguments de ligne de commande pour exécuter un programme. Voilà son travail.which gem | xargs rm
, par exemple, supprimera legem
dans votre CHEMIN.la source
rm
ne prend pas d'entrée, il prend des arguments. Ce sont différents. Les arguments sont les commutateurs et les noms de fichiers et ainsi de suite que vous donnez à un programme sur la ligne de commande pour affecter son comportement. L'entrée est les données sur lesquelles le programme travaille. Par exemple,grep
prend à la fois l'entrée et les arguments:Il y a deux arguments ici
"foo"
etfile.txt
. L' entrée est le contenu defile.txt
, pas la chaînefile.txt
elle-même. Puisque grep prend des entrées, vous pouvez les utiliser avec des tuyaux:produit la même sortie, car cat prend
file.txt
comme argument et produit le contenu defile.txt
comme sortie. Cette sortie est ensuite redirigée vers grep, donnant le même effet que d'avoir grep ouvrir le fichier lui-même, comme dans le premier exemple.Si vous souhaitez utiliser la sortie d'un programme comme argument d'un autre, vous utilisez des astuces:
ou cette syntaxe alternative (spécifique à bash):
Modifier: ou
xargs
comme le souligne un autre répondeur. De nombreuses façons de dépouiller un chat avec une ligne de commande.la source
cat file.txt | grep "foo"
peut être des centaines de fois plus lent quegrep "foo" file.txt
.grep --help
un aperçu rapide des arguments acceptés.Consultez les
man
pages de commandes qui vous intéressent. Ces programmes indiqueront qu'ils lisent à partir destdin
(essayezman grep
une commande populaire qui lit stdin).la source
man grep | grep 'standard input'
et obtenuIf no file arguments are specified, the standard input is used.
comme dernier match. 👍 J'ai dû donnergrep
un petit avant-goût de sa propre médecine. 😎Ceux-ci sont tous dangereux à exécuter si vous avez un répertoire dans votre PATH qui contient de l'espace ou si le nom de la commande contient de l'espace:
GNU Parallel http: // www.gnu.org/software/parallel/ n'a pas ce problème, donc cela fonctionnera même si vous avez un répertoire dans votre PATH qui contient de l'espace ou si le nom de la commande contient de l'espace:
Regardez la vidéo d'introduction pour GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
la source