1 votes

Transférer un fichier vers une commande qui n'implémente pas le piping

$ cat foo
foo
bar

Maintenant si je le fais :

$ some_program foo

Ça marche.

Mais si j'essaie :

$ cat foo | some_program

Ça ne marche pas.

Je cherche un moyen propre de canaliser l'entrée à some_program sans de devoir utiliser des fichiers temporaires désordonnés.

2voto

Bob Points 58080

La tuyauterie mettra cat foo vers la sortie de l'ordinateur some_program s stdin. Dans ce cas some_program attend un argument, pas stdin, donc vous voudrez enregistrer cat foo dans une variable et ensuite appeler some_program $variable .

Je ne suis pas trop sûr des scripts bash, mais essayez ceci ?

bar=`cat foo`
some_program $bar

En fait, peut-être que ça va marcher...

some_program `cat foo`

2voto

Cougar Points 549

En bash, vous pouvez utiliser la substitution de processus

$ some_program <(cat foo)

Vous pouvez ajouter autant de paramètres que vous le souhaitez de cette façon, tant que vous savez que ces paramètres seront des noms de fichiers qui seront en lecture seule. Vous ne pouvez pas lire et écrire en même temps.

2voto

aland Points 2810

Outre la méthode proposée par @Bob, il existe une autre méthode, plus souple : xargs :

Vous pourriez utiliser

cat foo | xargs some_program

ce qui est fondamentalement équivalent à

some_program `cat foo`

Si le programme n'attend qu'un seul argument à la fois, vous pouvez procéder comme suit

cat foo | xargs -n 1 some_program

Et some_program serait appelé une fois pour chaque ligne d'entrée.

Il existe de nombreuses autres options pour xargs comme la gestion des "mauvais" noms de fichiers (avec des espaces et d'autres caractères spéciaux), la limitation du nombre de processus en cours d'exécution simultanément, etc.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X