6
votes

Comment passer des paramètres de ligne de commande d'un fichier

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 arguments.dat avec ce contenu: xxx

et je veux que mon programme soit appelé avec: xxx

J'ai essayé ce qui suit: xxx

sans succès.


0 commentaires

3 Réponses :


14
votes

xargs est votre réponse: xxx

ou plus facile: xxx

vérifier le manuel pour les nombreux façons de personnaliser xargs . 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.


6 commentaires

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 De nombreuses variables de ligne de commande ou trop grandes, réduisent la longueur maximale de la ligne de commande), xargs exécutera ./ myprogram 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 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 J'utiliserais xargs -d \ n ... Mais pourquoi ne pas faire une réponse? Cela devrait certainement aller dans une bonne réponse.



9
votes

Avec la plupart des coquilles, vous pouvez insérer le contenu d'un fichier dans une ligne de commande avec $ (: xxx

si votre coquille ne Soutien que, puis l'une des voies anciennes fonctionnera: xxx

(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?)


3 commentaires

«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" , cela passerait "premier comme un argument, argument" comme deuxième, "Deuxièmement comme troisième. S'il contient, *. txt , il remplacera cela par une liste de fichiers texte, plutôt que de le garder littéral. Si le fichier contient "* .txt" , les citations seront transmises comme une partie littérale de la chaîne ( si l'utilisateur n'a pas nullglob ou écheclob 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).



4
votes

Si vous ne voulez pas que des arguments soient divisés silencieusement

... ce qui est à dire: les réponses ci-dessous s'appliquent aux cas où il ne serait pas acceptable pour ./ 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>

c'est-à-dire si votre entrée ressemble à: P > xxx pré>

et vous voulez dire ceci pour exécuter: p>

xargs -0 ./myprogram <arguments.dat


0 commentaires