Habituellement, nous n'avons qu'à passer un argument:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Existe-t-il un moyen de passer deux arguments? Quelque chose comme
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Je pourrais tout d'abord stocker les deux résultats dans un fichier
echo abc > file1
echo xyz > file2
cat file1 file2
Mais alors je pourrais accidentellement écraser un fichier, ce qui n'est pas correct. Cela entre dans un script non interactif. Fondamentalement, j'ai besoin d'un moyen de transmettre les résultats de deux commandes arbitraires à cat
sans écrire dans un fichier.
MISE À JOUR: Désolé, l'exemple masque le problème. Bien que { echo abc ; echo xyz ; } | cat
cela semble fonctionner, la sortie est due au echo
s, pas au cat
.
Un meilleur exemple serait celui { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
qui ne fonctionne pas comme prévu.
Avec
file1:
a,b
c,d
file2:
1,2
3,4
La sortie attendue est:
b,1
d,3
RÉSOLU:
Utilisez la substitution de processus :cat <(command1) <(command2)
Vous pouvez également créer des canaux nommés à l'aide de mkfifo
:
mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
Moins élégant et plus verbeux, mais fonctionne très bien, tant que vous vous assurez que temp1 et temp2 n'existent pas au préalable.
Réponses:
Je pense que vous voulez «Process Substitution» http://tldp.org/LDP/abs/html/process-sub.html . Il fonctionne également sur zsh, bien qu'il ait plus d'options et que la syntaxe puisse être différente.
Il crée un pseudo fichier (
/dev/fd/something
) pour chaque substitution. C'est assez utile. La commande ne peut être lue que comme un flux, ce qui signifie qu'elle ne peut pas aller et venir avec fseek. Il doit le lire comme un flux d'octets, comme un tuyau.Vos exemples fonctionnent comme substitution de processus:
Considérez-le comme un outil pour utiliser un processus et faites-le prétendre être un fichier sans aucun fichier temporaire.
(d'après ma réponse précédente )
la source
Le truc des accolades bouclés a réellement fonctionné parce que l'opérateur de tuyau connectera les sorties standard des commandes groupées à l'entrée standard de la troisième.
Vous pouvez dire que l'impression ne provient pas des échos en exécutant une commande qui n'utilise pas d'entrée standard, par exemple
{ echo 1; echo 2;} | echo 3
, imprimera 3 par opposition à 1 \ n2 \ n3.Cependant, ce n'est pas la chose que vous vouliez, car les deux commandes entre accolades écrivent sur la même sortie, ce qui revient à
cat
comparer leurs résultats. Pour générer deux résultats différents à utiliser comme deux arguments pour des commandes commepaste
, vous devrez utiliser un fichier temporaire ou un canal nommé.Vous pouvez utiliser
mktemp
pour générer un fichier temporaire unique oumkfifo
pour créer un fichier de canal FIFO.la source
J'aime les xargs Par exemple, je veux trouver la taille de tous les répertoires de données mysql sous / usr / local
xargs
la source