bash에서 여러 개의 here-docs를 사용할 수 있습니까?


14

bash의 명령에 입력을 제공하기 위해 여러 here-docs를 사용할 수 있습니까?

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

분명히 두 경우 모두 두 번째 here-doc은 stdin으로 사용되며 첫 번째 참조를 대체합니다. 솔루션이 echo대신 s를 사용합니까?

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

또한 어떤 이유로 조합을 사용하는 것이 효과가 없었습니다. 왜 그런가요?

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

여기에 두 개의 문서를 하나로 묶지 않고 사용하려는 이유가 있습니까?

1
@beans 나는 paste더미 입력으로 테스트 할 때 실제로 그것에 부딪쳤다 . 몇 가지 다른 시나리오를 생각할 수 있다고 가정합니다. 몇 가지 변수에 사전 조작 된 텍스트가 포함 된 스크립트가있는 경우 파일 만 가져 오는 명령을 사용하여 두 가지 작업을 모두 수행 할 수 있습니다 (예 :) diff.
Sparhawk

또 다른 유스 케이스 (여기서는 doc 스크립트를 작성하기 위해 here-docs를 사용하여 이것을 발견했습니다) : 변수 확장이있는 몇 줄과 다음이없는 줄을 원합니다 cat <<EOF1 <<"EOF2".
Toby Speight

답변:


18

넌 할 수있어:

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

파일 디스크립터 0이 하나뿐이므로 stdin은 하나만있을 수 있습니다.

cat << EOF
eof
EOF

짧다 :

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

과:

cat <<< foo

입니다 :

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

파일 디스크립터 0에서 무엇을 열어야하는지 생각해야합니다.

cat <(echo foo)

입니다 :

cat /dev/fd/123

123파이프에 대한 파일 디스크립터는 어디에 있고 동시에 bash는 echo foostdout이 파이프의 다른 쪽 끝으로 경로 재 지정된 다른 프로세스에서 실행됩니다 .

파일 이름을 전달하면 cat , cat더 이상 표준 입력에서 읽을 수 없습니다. 필요한 것 :

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

또는:

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

( stdin에서 읽 -도록 cat지시하는 것입니다).


1
cat <<EOFcat /dev/fd/0...후자의 경우 cat파일 이름을보고 열기를 수행하는 것과 정확히 동일 하지 않습니다.
Mikel

@Mikel, 내가 의미하는 것은 기능적으로 동일 하다는 것입니다 . 인수를 전달하지 않으면 또는 인수를 전달한 것처럼 0 cat에서 읽습니다 (리눅스 (및 Linux에서만)하지만 여는 것은 파일 설명자 0을 복제하는 것과 정확히 같지 않습니다). fd-/dev/fd/0/dev/fd/0
Stéphane Chazelas

나는 구조에 매우 놀랐고 /dev/fd/3 3<< E1/ dev / fd / 아래의 항목이 무엇인지 궁금합니다. 프로세스가 파일 시스템의 어딘가에서 파일을 열면 모든 프로세스에 대해 기본적으로 1과 2를 제외하고는 어떻게 든 마술처럼 보입니다. 그러나 귀하의 예에서는 입력 리디렉션을 제외하고 실제 파일에 연결되지 않은 파일 설명자 3 및 4를 사용하고 있습니다. 파일 설명 자의 정신적 모델에서 이해할 수 없습니다. 프로세스가 다른 파일을 열려면 fd 5를 사용해야한다는 것을 어떻게 알 수 있습니까? fds는 3, 4, 5 여야합니까? 아니면 무엇이든 될 수 있습니까?
calavera.info

@ calavera.info, 후속 질문을 만들고 싶은 것 같습니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.