Utilisez la while read
boucle:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Une autre consiste à rediriger la sortie par bloc:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Le dernier consiste à ouvrir le fichier:
exec 4> another_file
while IFS= read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Si l'une des commandes lit l'entrée, ce serait une bonne idée d'utiliser un autre fichier fd pour que l'entrée ne le mange pas (ici en supposant ksh
, zsh
ou bash
pour -u 3
, utilisez <&3
plutôt portable):
while IFS= read -ru 3 LINE; do
...
done 3< file
Enfin pour accepter les arguments, vous pouvez faire:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while IFS= read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
Lequel pourrait fonctionner comme:
bash script.sh file another_file
Idée supplémentaire. Avec bash
, utilisez readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Remarque: vous IFS=
pouvez l'omettre si vous ne craignez pas de supprimer les valeurs de ligne des espaces de début et de fin.
<file xargs -L 1 -I{} command --option {} other args
Garder précisément à la question:
la source
La meilleure réponse que j'ai trouvée est:
MODIFIER:
... quatre ans plus tard ...
après plusieurs votes négatifs et un peu plus d'expérience, je recommanderais maintenant ce qui suit
la source
do "$cmd" "$i";
), sauf si vous avez une raison de ne pas le faire; si le fichier contient un*
mot en tant que mot seul, votre code sera exécuté$cmd *
, ce qui, bien sûr, exécutera la commande avec une liste des fichiers du répertoire en cours.zsh
, le`cat`
développerait déjà le*
(le non cité$i
pourrait encore développer un caractère générique (un second tour) si le développement de`cat`
introduit certains). En tout cas, cette approche est en effet fausse.SORTIE
la source
Prenez toutes les lignes d’un fichier et transmettez-les en tant qu’arguments à une seule commande, c.-à-d.
Si vous avez besoin que l'
--option
indicateur précède chaque ligne, modifiez la deuxième commande en:la source
'
,"
,<
,>
,;
, etc. (3) Cela crée un fichier temporaire inutile. (4) Ce genre de chose se fait généralement avec «ici des documents». (5) Vosed
ordres sont maladroits; les deux premières commandes peuvent être réduites à%s/^/ /
et%j
.