& o redirecionamento não está funcionando corretamente

0

Por favor, veja a seguinte transcrição do shell:

$ ls
input.txt  test-amp-gt.sh  test-both-2.sh  test-both.sh  test-gt.sh

$ cat input.txt
input file

$ cat test-gt.sh
#! /bin/sh
cat input.txt > /dev/null && echo "DEBUG >"

$ ./test-gt.sh
DEBUG >

$ cat test-amp-gt.sh
#! /bin/sh
cat input.txt &> /dev/null && echo "DEBUG &>"

$ ./test-amp-gt.sh
DEBUG &>
$ input file
^C
$


$ cat test-both.sh
#! /bin/sh
cat input.txt > /dev/null && echo "DEBUG >"
echo "***"
cat input.txt &> /dev/null && echo "DEBUG &>"

$ ./test-both.sh
DEBUG >
***
DEBUG &>
$ input file
^C
$

$ cat test-both-2.sh
#! /bin/sh
cat input.txt &> /dev/null && echo "DEBUG &>"
echo "***"
cat input.txt > /dev/null && echo "DEBUG >"

$ ./test-both-2.sh
DEBUG &>
***
input file
DEBUG >
$

Não ficou claro para mim por que o redirecionamento & > para / dev / null aparentemente não está funcionando corretamente quando a planície > está funcionando bem. Ou seja, na execução de test-amp-gt.sh, o conteúdo do arquivo de texto não deveria ter sido produzido, mas sim. test-both-2.sh mostra um comportamento ainda mais curioso do & > - o texto não deveria ter sido gerado, mas não é apenas a saída, mas é a saída após a saída do comando echo na próxima linha!

Por que isso acontece?

    
por jamadagni 08.12.2013 / 06:33

1 resposta

3

Porque você não está usando bash ou outro shell que entenda &> . Observe a linha no topo dos seus scripts de shell:

#!/bin/sh

Esses scripts de shell serão executados com /bin/sh . Em muitos sistemas que são ligados simbolicamente a bash, mas aparentemente não no seu. Provavelmente, é dash ou alguma outra alternativa leve.

& é usado para colocar comandos em segundo plano em scripts de shell. Seu shell está interpretando o & in &> com este significado. Então, em test-amp-gt.sh :

#! /bin/sh
cat input.txt &> /dev/null && echo "DEBUG &>"

Primeiramente, ele inicia cat input.txt no segundo plano, depois vê > /dev/null , que aparentemente ignora, e executa echo DEBUG &> , que é gerado como deveria. Seu script, em seguida, é concluído, o shell que você chamou test-amp-gt.sh from imprime seu prompt e, em seguida, o cat no plano de fundo gera input.txt .

    
por 08.12.2013 / 07:02