72 votes

Puis-je utiliser la sortie de pipe comme argument de Shell Shell ?

Supposons que j'ai une bash Shell Shell appelée Myscript.sh qui ont besoin d'un argument en entrée.

Mais je veux le contenu du fichier texte appelé text.txt pour être cet argument.

J'ai essayé mais cela ne fonctionne pas :

cat text.txt | ./Myscript.sh

Y a-t-il un moyen de le faire ?

70voto

zzart Points 661

Vous pouvez utiliser la sortie pipe comme un argument Shell Shell.

Essayez cette méthode :

cat text.txt | xargs -I {} ./Myscript.sh {}

51voto

Ignacio Vazquez-Abrams Points 107432

Substitution de commande .

./Myscript.sh "$(cat text.txt)"

7voto

aznoqmous Points 51

Pour compléter @bac0n qui, à mon avis, est le seul à répondre correctement à la question, voici un raccourci qui ajoutera les arguments pipés à votre liste d'arguments script :

#!/bin/bash

declare -a A=("$@")
[[ -p /dev/stdin ]] && { \
    mapfile -t -O ${#A[@]} A; set -- "${A[@]}"; \
}

echo "$@"

Exemple d'utilisation :

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3

5voto

Jama22 Points 356

Mettez-le dans xargs avant la commande proprement dite, comme cat text.txt | xargs ./Myscript.sh

4voto

Fern Moss Points 8273

Si vous avez plus d'un jeu d'arguments dans le fichier (pour des appels multiples), envisagez d'utiliser la fonction xargs o parallèle par exemple

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

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