É possível usar vários docs aqui no bash?

12

Alguém pode usar vários aqui-docs para fornecer entrada para um comando no bash?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

Obviamente, em ambos os casos, o segundo aqui-doc é usado como stdin e substitui a primeira referência. A solução é usar echo s?

$ cat <(echo -n foo) <(echo bar)
foobar

Além disso, por alguma razão, usar uma combinação não funcionou para mim. Por que isso seria?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo
    
por Sparhawk 03.08.2014 / 13:10

1 resposta

14

Você pode fazer:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

Pode haver apenas um stdin, pois há apenas um descritor de arquivo 0.

cat << EOF
eof
EOF

é a abreviação de:

cat /dev/fd/0 0<< EOF
eof
EOF

E:

cat <<< foo

é:

cat /dev/fd/0 0<<< foo

Você precisa decidir o que abrir no descritor de arquivo 0.

cat <(echo foo)

é:

cat /dev/fd/123

Em que 123 é um descritor de arquivo para um canal e, em paralelo, o bash executa echo foo em outro processo com o stdout redirecionado para a outra extremidade do canal.

Depois de passar um nome de arquivo para cat , cat não lê mais de stdin. Você precisaria:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

Ou:

cat <(echo foo) - << EOF
bar
EOF

( - é para informar cat para ler a partir de stdin).

    
por 03.08.2014 / 17:52