Peut-on utiliser plusieurs here-docs pour fournir une entrée à une commande dans bash?
$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar
Évidemment, dans les deux cas, le second here-doc est utilisé comme stdin, et remplace la première référence. La solution consiste-t-elle à utiliser echo
s à la place?
$ cat <(echo -n foo) <(echo bar)
foobar
De plus, pour une raison quelconque, l'utilisation d'une combinaison n'a pas fonctionné pour moi. Pourquoi serait-ce?
$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo
bash
io-redirection
here-document
Sparhawk
la source
la source
paste
avec des entrées factices. Je suppose que je peux penser à quelques autres scénarios. Si j'avais eu un script avec du texte pré-manipulé dans quelques variables, alors je pourrais vouloir faire quelque chose aux deux avec une commande qui ne prend que des fichiers, par exemplediff
.cat <<EOF1 <<"EOF2"
.Réponses:
Tu peux faire:
Il ne peut y avoir qu'un seul stdin, car il n'y a qu'un seul descripteur de fichier 0.
est l'abréviation de:
Et:
est:
Vous devez décider quoi ouvrir sur le descripteur de fichier 0.
Est:
Où
123
est un descripteur de fichier pour un canal, et en parallèle, bash s'exécuteecho foo
dans un autre processus avec la sortie standard redirigée vers l'autre extrémité du canal.Une fois que vous avez passé un nom de fichier à
cat
,cat
ne lisez plus depuis stdin. Vous auriez besoin de:Ou:
(
-
c'est direcat
de lire depuis stdin).la source
cat <<EOF
n'est pas exactement le même quecat /dev/fd/0...
: dans ce dernier cascat
voit le nom du fichier et fait l'ouvrir.cat
lit à partir de sonfd
0, comme s'il avait passé un argument de-
ou/dev/fd/0
(bien que sur Linux (et Linux uniquement), l'ouverture/dev/fd/0
ne ressemble pas exactement à la duplication du descripteur de fichier 0)./dev/fd/3 3<< E1
construction et je me demande maintenant ce que sont exactement les éléments sous / dev / fd /. Je pense qu'ils semblent en quelque sorte magiques après que le processus ouvre un fichier quelque part sur le système de fichiers à l'exception de 1 et 2 qui sont là par défaut pour chaque processus. Mais dans votre exemple, vous utilisez les descripteurs de fichiers 3 et 4 qui ne sont connectés à aucun fichier réel, à l'exception de cette redirection d'entrée. Je ne peux pas comprendre cela dans mon modèle mental de descripteurs de fichiers. Que faire si le processus souhaite ouvrir un autre fichier, saura-t-il qu'il doit utiliser fd 5? Les fds doivent-ils être 3, 4, 5 .. ou peuvent être n'importe quoi?