Como entender o comando "cat> file_name << blah"?

13

No comando a seguir, cat pega o conteúdo do here-doc e o redireciona para o arquivo chamado conf:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

Como entender a ordem dos comandos aqui? O bashprimeiro processa todo o resto (parte do documento aqui) e, como etapa final, parece a > confparte?

Martin
fonte

Respostas:

17

Here-Document é um tipo de redirecionamento de shell, portanto, o shell o executará como redirecionamento normal, do começo ao fim (ou da esquerda para a direita ou ordem de aparência). Isso é definido pelo POSIX:

Se mais de um operador de redirecionamento for especificado com um comando, a ordem da avaliação será do começo ao fim.


No seu comando, catvocê executará > confprimeiro, abrir e truncar o confarquivo para gravação e, em seguida, ler os dados Here-Document.

Usando strace, você pode verificar:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...
cuonglm
fonte
Entendo. Então, basicamente, o que acontece no caso de cat > file_name << blahé que, antes de executar, cato stdout do shell é conectado ao arquivo nomeado file_namee o stdin do shell é conectado ao here-doc ?
Martin
@ Martin: Sim. Você pode ver que openfoi chamado antes dup2.
cuonglm
12

Bem, vamos descobrir:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Dang. Eu acho que deve estar fazendo a >"$file"parte primeiro então. Mas e se...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

... nenhum erro ...?

cat ./myfile

this is in ./myfile

Como parece, a ordem é importante.

mikeserv
fonte
-1

Quando bashcria o processo a ser executado cat, ele abre confpara gravação no descritor de arquivo 1 e abre um arquivo temporário (para o documento aqui) para leitura no descritor de arquivo 0, antes de iniciar execo programa. Nesse caso, não importa realmente em qual ordem essas ações acontecem.

A ordem se torna significativa quando os descritores de arquivos são reatribuídos, por exemplo, com 2>&1.

Toby Speight
fonte