Compare 3 e 2 e 3 e 2?

0

Algumas perguntas muito simples:

Os redirecionamentos 3 > & 2 e 3 < & 2 são diferentes?

Quais são as diferenças?

É apenas isso em 3 > & 2 deve gerar um erro, pois 2 não está aberto para entrada?

Compare:

{ seq 20 1<&2; } 2>/dev/null

{ seq 20 1>&2; } 2>/dev/null

EDIT: resposta

Ambos os comandos executam a mesma duplicação de 1 e 2. A saída disso:

$ strace -f -e trace=dup,dup2 -o o2 sh -c 'seq 20 1>&2'

é exatamente igual (ao lado dos números PID) para ambos os comandos.

    
por Isaac 25.07.2018 / 14:17

2 respostas

3

Não, eles são estritamente equivalentes, o shell acaba fazendo dup2(2, 3) para 3>&2 e 3<&2 . O fd 3 , em seguida, acaba apontando para a mesma descrição do arquivo aberto como em fd 2. Ele não tem influência no modo / direção daquela descrição do arquivo aberto . Não é possível alterar o modo / direção de uma descrição de arquivo aberto.

Os operadores x>&y e x<&y são diferentes apenas quando x é omitido. >&y é 1>&y (igual a 1<&y ) enquanto <&y é 0<&y (igual a 0>&y ).

    
por 25.07.2018 / 14:46
2

Um redireciona stderr para saída e o outro para entrada.

Se você gosta de ter o stderr aberto para leitura e escrita, você pode usar:

2<>/dev/null

Se você efetuar login, todos os três descritores de arquivos estarão abertos para leitura e gravação.

Isso é feito primeiro abrindo o tty e chamando dup() 2 vezes.

Os comandos

{ seq 20 1<&2; } 2>/dev/null

e

{ seq 20 1>&2; } 2>/dev/null

são equivalentes porque o redirecionamento final cria um descritor de arquivo que está aberto para gravação.

Se você ligar:

{ truss -o o seq 20 1<&2; } 2>/dev/null

você verá que a chamada de gravação de seq é bem-sucedida E BTW: a saída de seq vai para / dev / null

    
por 25.07.2018 / 14:20