Question
Je veux comprendre l'utilisation de xargs man
dans Code de raiponce :
screen -t man /bin/sh -c 'xargs man || read'
Merci à RAMPION: on n'a pas besoin de chat
Pourquoi avons-nous besoin xargs
dans la commande?
Je comprends la -partie de xargs
comme suit
- rien de chat à xargs
- xargs fait une liste de l'homme -commandes
J'ai eu une idée qui xargs fait une liste de commandes. Par exemple,
find . -type f -print0 | xargs -0 grep masi
est la même que la liste des commandes:
find fileA AND grep masi in it
find fileB AND grep masi in it
and so on for fileC, fileD, ...
La solution
Non, je ne cat
rien. Je chat tout entrée je reçois quand je lance la commande. cat
est en fait ici étrangère, donc nous allons l'ignorer.
xargs man
attend l'entrée utilisateur. Ce qui est nécessaire. Etant donné que dans le script que vous empoigné que de, je ne peux pas coller dans l'argument pour l'homme jusqu'à ce que je crée la fenêtre. Ainsi, la commande qui fonctionne dans la fenêtre doit attendre pour moi de lui donner quelque chose, avant qu'il ne tente d'exécuter l'homme.
Si nous avons manqué screen /bin/sh -d 'man || read'
, il serait toujours porter plainte « Quelle page de manuel que vous voulez? » puisque nous ne dit que ce.
Autres conseils
xargs arguments de stdin rassemble et exécute la commande donnée avec ces arguments.
chat attend quelque chose à taper, puis xargs est en cours d'exécution homme avec cette entrée.
xargs est utile si vous avez beaucoup de fichiers à traiter, je l'utilise souvent avec une sortie de découverte.
xargs farcir autant d'arguments qu'il le peut sur la ligne de commande.
Il est idéal pour faire quelque chose comme
find . -name '*.o' -print | xargs rm
La commande cat
ne fonctionne pas rien; il fonctionne sur l'entrée standard, jusqu'à ce qu'il soit dit que l'entrée est terminée. Comme le fait remarquer raiponce, la commande cat
n'est pas nécessaire, mais il fonctionne sur son entrée implicite (entrée standard), et non sur rien.
La commande xargs
lit la sortie de cat
, et des groupes les informations dans les arguments à la commande man
spécifié en tant que son argument (uniquement). Quand il atteint une limite (configurable sur la ligne de commande), il exécutera la commande man
.
Les offres idiome de find ... -print0 | xargs -0 ...
avec des noms de fichiers contenant des caractères maladroits tels que des espaces, des onglets et des sauts de ligne. Les impressions de commande de find
chaque nom de fichier suivie d'une NUL ASCII ('\0'
); c'est l'un des deux personnages qui ne peuvent pas apparaître dans un simple nom de fichier - l'autre étant « / » (qui apparaît dans les noms de chemin, bien sûr, mais pas dans les noms de fichiers simples). Il n'est pas directement équivalente à la séquence que vous fournissez; collections groupes xargs
de noms de fichiers dans une seule liste d'arguments, jusqu'à une limite de taille. Si les noms sont assez courts (ils sont en général), alors il y aura moins d'exécutions de grep
que il y a des noms de fichiers.
Note, aussi, le grep
imprime uniquement le nom du fichier dans lequel le matériel est trouvé si elle a plus d'un fichier à la recherche - ou si elle prend en charge une option pour qu'il imprime toujours les noms de fichiers et est utilisé l'option: « -H
» est une extension GNU grep
qui fait cela. La façon portable pour faire en sorte que les noms de fichiers apparaissent toujours à la liste est /dev/null
que le premier fichier (si « xargs grep something /dev/null
»); il ne faut pas longtemps à la recherche /dev/null
.