Diferença entre e | com / dev / tty

2

Quando eu executo este comando:

echo "1" > /dev/tty # runs successfully 

mas quando eu executo isso:

echo "1" | /dev/tty #permission denied

Qual é a diferença entre esses dois operadores > e | e por que o canal causa um erro?

    
por rubixibuc 05.10.2011 / 23:16

2 respostas

9

Resposta curta: > deve ser seguido por um nome de arquivo ou &n (n é um número) e | deve ser seguido por outra chamada de comando.

Detalhes: Na sintaxe do shell, uma chamada para algum comando contém vários componentes. Exemplo:

A=foo 2>/dev/null B=bar cmd arg1 arg2 >file 3>&4 arg3

Aqui, os parâmetros 2>/dev/null , >file e 3>&4 são parâmetros especiais (contendo um > un sem escape), eles são usados para estabelecer redirecionamentos io e podem aparecer em qualquer lugar na linha de comando. Filedesciptor 2 é redirecionado para /dev/null , filedescriptor 1 (implícito) é redirecionado para file e filedescriptor 3 é redirecionado para o que o filedescriptor 4 estava vinculado.

Então, entre os demais parâmetros, A=foo e B=bar contêm = , então eles não são considerados como o nome do comando: eles fornecem valores específicos para variáveis de ambiente do processo a ser lançado.

Em seguida, vem o comando cmd e os argumentos reais: arg1 , arg2 , arg3 .

O canal | não faz parte de uma chamada de comando, ele vincula duas dessas invocações. Exemplo:

CC=gcc make 2>&1 | LESS=--quit-at-eof less

A saída no filedescriptor 1 pelo primeiro processo será recebida como entrada no filedescriptor 0 pelo segundo processo, através de um “pipe” que age como um buffer.

-
1. De fato, os caracteres especiais como > são vistos algumas vezes seguidos por um espaço. Mesmo que isso seja permitido, as duas sequências (separadas por espaço) devem ser entendidas como uma "entidade" única.

    
por 05.10.2011 / 23:33
6

O | é usado para enviar dados entre processos enquanto > é usado para redirecionar um fluxo para um arquivo. /dev/tty é um "arquivo" / dispositivo de propriedade do root e suas permissões são configuradas para 666 como resultado quando você tenta redirecionar para ele seu shell tenta executar / dev / tty para transmitir dados para ele e ele não tem permissões de execução.

    
por 05.10.2011 / 23:26