Comando com pipeline e redirecionamento

3

Qual é a ordem dos comandos executados que possuem redirecionamento de pipeline e de saída?

Digamos que façamos o seguinte:

Charles@myzone:/tmp$ mkdir /tmp/testdir      
Charles@myzone:/tmp$ cd /tmp/testdir   
Charles@myzone:/tmp/testdir$ touch file1 file2  
Charles@myzone:/tmp/testdir$ ls | wc -l
2
Charles@myzone:/tmp/testdir$ ls | wc -l > ls_result
Charles@myzone:/tmp/testdir$ cat ls_result
3

Se você usar ls > result , então result conterá o nome de si mesmo porque o shell fará algo como

1) crie / abra o arquivo chamado result 2) defina o fd de result para ser stdout 3) exec ls

Eu esperava que ls_result tivesse valor 2, mas é 3.

Pergunta

Como o comando ls | wc -w > ls_result acima é executado?

É equivalente a (ls | wc -w ) > ls_result ?

Alguns links com informações preocupantes? (Eu olhei para o manual de bash)

    
por Charles 11.05.2018 / 10:31

2 respostas

14
utility1 | utility2 >output

não é equivalente a

( utility1 | utility2 ) >output

mas para

utility1 | { utility2 >output; }

Os dois utilitários são iniciados praticamente ao mesmo tempo, o que significa que você esperaria que seu comando retornasse às vezes 3 e às vezes 2.

Exemplo:

$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test

O exemplo acima mostra que o arquivo criado pelo lado direito do pipeline é algumas vezes detectado pelo lado esquerdo do pipeline.

    
por 11.05.2018 / 10:40
3

man bash

REDIRECTION
       Before  a  command is executed, its input and output may be redirected using a special notation interpreted by the shell.  Redirection
       may also be used to open and close files for the current shell execution environment.  The following redirection operators may precede
       or appear anywhere within a simple command or may follow a command.  Redirections are processed in the order they appear, from left to
       right.

assim, quando você executa o comando, o comando ls_result está sendo criado e, em seguida, ele executa o comando ls. É por isso que a saída vem como 3.

ls | wc -l > ls_result

    
por 11.05.2018 / 10:44