J'ai un programme C qui lit les arguments de ligne de commande de Argv. Est-il possible de faire un tuyau pour rediriger le contenu d'un fichier en tant qu'arguments de ligne de commande vers mon programme? Supposons que j'ai un fichier et je veux que mon programme soit appelé avec: p> J'ai essayé ce qui suit: p> sans succès. p> p> arguments.dat code> avec ce contenu:
3 Réponses :
ou plus facile: p> vérifier le manuel pour les nombreux façons de personnaliser xargs code> est votre réponse:
xargs code>. Par exemple, vous pouvez lire la ligne ligne-ligne plutôt que par mot, et vous pouvez utiliser les arguments dans des remplacements plus complexes. P> P>
Il y a des mises en garde ici - si votre fichier contient plus d'arguments que d'être adaptés à une seule ligne de commande (et que vous gardez à l'esprit que les variables d'environnement et les arguments de ligne de commande utilisent le même espace - donc export code> De nombreuses variables de ligne de commande ou trop grandes, réduisent la longueur maximale de la ligne de commande),
xargs code> exécutera
./ myprogram code> plus d'une fois, séparant les arguments à travers les invocations .
@CHARLESDUFFY: Bon point. Cela peut être un bogue ou une fonctionnalité beaucoup recherchée, en fonction du cas d'utilisation. En tout cas, j'ai ajouté un autre mécanisme.
@CHARLESDUFFY: Oui, en effet. Bash a également un moyen de vous laisser modifier une ligne de commande avec un éditeur. Et xargs code> a de nombreuses façons de fonctionnement avancées qui vous permettent de citer les arguments et de lire la ligne de ligne et tout cela.
@CHARLESDUFFY: Ouais, c'est certainement ce que je ferais dans un script réutilisable. Si c'est pour une utilisation unique, cependant, où vous savez à peu près ce que sont les arguments, les Xargs simples sont souvent tout ce dont vous avez besoin.
Sûr. J'essaie de faire une dispute sur l'exactitude, car une réponse de Stackoverflow est par nature réutilisable - c'est (idéalement) à lire et à utiliser par un grand nombre de personnes (dans de nombreux scénarios différents, dont certaines des affaires d'utilisation peuvent varier de l'OP), alors le temps et les efforts consacrés à l'obtention du droit de détails conviennent bien. Cela dit, si je devais juste aller ajouter une réponse concurrente, n'hésitez pas à me le dire. :)
@CHARLESDUFFY: avec ls -1 code> J'utiliserais
xargs -d \ n code> ... Mais pourquoi ne pas faire une réponse? Cela devrait certainement aller dans une bonne réponse.
Avec la plupart des coquilles, vous pouvez insérer le contenu d'un fichier dans une ligne de commande avec si votre coquille ne Soutien que, puis l'une des voies anciennes fonctionnera: p> (Vous connaissez la différence entre les arguments de ligne de commande et l'entrée de fichier, non? Pourquoi vous attendriez-vous à la commande de tuyau? arguments de ligne dans un programme?) p> p> $ (
«Vieux façons» ne divisera pas les arguments. Toutes les données du fichier seront chargées comme argument unique.
@osgx: C'est tout simplement faux. Pour en faire un seul argument, vous auriez besoin de la mettre à l'intérieur des citations doubles.
Si votre fichier contient "premier argument" "second argument" code>, cela passerait
"premier code> comme un argument,
argument" code> comme deuxième,
"Deuxièmement code> comme troisième. S'il contient,
*. txt code>, il remplacera cela par une liste de fichiers texte, plutôt que de le garder littéral. Si le fichier contient
"* .txt" code>, les citations seront transmises comme une partie littérale de la chaîne ( si i> l'utilisateur n'a pas
nullglob code> ou
écheclob CODE> AVEC L'AVANT D'ÊTRE TRAITÉ COMME UN TRAITEMENT DE GLOFFFAIRE DANS UN ELIMINAIRE ... Eh bien, Équipez-vous s'il n'y a pas de fichiers avec des noms qui commencent et se terminent par des caractères littéraux à double citation).
... ce qui est à dire: les réponses ci-dessous s'appliquent aux cas où il ne serait pas acceptable pour c'est-à-dire si votre entrée ressemble à: P > et vous voulez dire ceci pour exécuter: p> ./ Myprogram - Dégumentations-arguments "Première valeur" code> pour être modifié silencieusement en
./ myprogram - curseur-argument; ./mypramram "Première valeur" code>. P>
Si vos arguments sont des littéraux à une ligne h3>
xargs -0 ./myprogram <arguments.dat