Como entender o comando “cat file_name blah”?

12

No comando seguinte, o 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 bash primeiro processa todo o resto (parte do aqui-doc) e como uma etapa final, parece que o > conf parte?

    
por Martin 02.07.2015 / 18:13

3 respostas

17

Aqui-Documento é um tipo de redirecionamento de shell, então o shell executará como redirecionamento normal, do começo ao fim (ou da esquerda para a direita, ou ordem de aparição). Isso é definido pelo POSIX:

If more than one redirection operator is specified with a command, the order of evaluation is from beginning to end.

Em seu comando, cat executará > conf primeiro, abrirá e truncará o arquivo conf para gravação e, em seguida, lerá os dados de 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
...
    
por 02.07.2015 / 18:25
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 parte >"$file" primeiro então. Mas e se ...?

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

... sem erro ...?

cat ./myfile
this is in ./myfile

Como parece, a ordem é importante.

    
por 02.07.2015 / 18:21
-1

Quando bash cria o processo para executar cat , abre conf para gravação no descritor de arquivo 1 e abre um arquivo temporário (para o aqui-documento) para leitura no descritor de arquivo 0, antes de exec o programa. Nesse caso, não importa em qual ordem essas ações acontecem.

O pedido se torna significativo quando os descritores de arquivos são reatribuídos, por exemplo, com 2>&1 .

    
por 02.07.2015 / 18:25