O que faz / dev / null 2 & 1 || verdadeiro significado no Linux?

4
"command "> /dev/null 2>&1 || true  

Agora percebo que estamos enviando a saída de um comando que executamos para um arquivo nulo. Eu preciso saber o significado específico para *2>&1 || true*

    
por Aso'K 17.02.2017 / 13:11

2 respostas

9

TL; DR: >/dev/null 2>&1 || true silencia efetivamente o comando, descartando qualquer saída (erro ou normal) e o resultado do comando, mas nenhum de seus efeitos colaterais. O que segue é uma explicação do porquê.

Os programas Linux por padrão recebem três descritores de arquivos que são abertos antes que o código principal do programa comece a ser executado. Estes são stdin (entrada padrão, descritor de arquivo 0), stdout (saída padrão, descritor de arquivo 1) e stderr (erro padrão, descritor de arquivo 2). Estes são normalmente ligados ao terminal atual, que hoje significa efetivamente o teclado, a tela e a tela, respectivamente (mas nem sempre foi o caso).

Ao especificar > /dev/null no comando (o redirecionamento geralmente pode ir a qualquer lugar dentro do comando, mas por convenção ele vai no final ou muito raramente no início), você especifica que a saída padrão ( 1 implícito, mas pode ser especificado usando 1> em vez de apenas > ) deve ser redirecionado para gravar em /dev/null , que descarta tudo o que está escrito nele.

2>&1 , em seguida, redireciona o descritor de arquivo 2 ( 2> ) para qual descritor de arquivo 1 está atualmente vinculado a ( &1 ).

Um atalho para quando você deseja redirecionar ambos stdout e stderr para o mesmo local é usar &> como em &> /dev/null . Isso não é suportado em todos os shells, no entanto.

Portanto, especificando > /dev/null 2>&1 , você diz ao sistema que deseja redirecionar a saída padrão do comando para / dev / null e, em seguida, redireciona o erro padrão para a saída padrão (que por sua vez é redirecionada para / dev / null). Isso tem o efeito de silenciar o comando jogando fora toda a sua saída enviada para stdout ou stderr.

Observe que alguns programas usam meios alternativos de desenho na tela, como uma biblioteca terminal como ncurses, e geralmente não serão afetados por isso ou serão afetados de maneiras inesperadas. Mas para programas escritos para serem usados em uma forma de pipe (que inclui a maioria dos programas que geram texto simples para o terminal), isso funciona.

O || , por sua vez, significa que se o programa retornar um status de saída diferente de 0 (onde por convenção 0 significa execução bem-sucedida), o shell invocará o comando do outro lado do o || , que nesse caso é true . Não confunda isso com o pipe comum, que usa um único | e liga o stdout do lado esquerdo ao stdin do lado direito. O oposto de || é && que executa o lado direito apenas se o lado esquerdo retornou um status de saída igual a 0, e um complementar é ; , que simplesmente separa vários comandos (o segundo comando será executado independentemente do status de saída do primeiro comando).

true , por sua vez, é um programa muito simples que tem como único propósito sair com um status de sucesso. Geralmente não é muito útil por si só, mas pode ser muito útil, por exemplo, ao escrever condicionais em scripts de shell. Seu oposto é false , que sai com um status de falha (diferente de zero), mas por outro lado, como o verdadeiro, não faz nada.

Então, anexando || true após um comando, você sabe que de qualquer forma, algo será executado com sucesso no momento em que o conjunto de comandos terminar de ser executado. Assim, você sabe que o código de status atual (disponível em $? ) sempre indicará uma execução bem-sucedida.

    
por 17.02.2017 / 13:50
1

What does "command " > /dev/null 2>&1 || true mean in Linux?

2>&1 significa "redirecionar STDERR (2) para STDOUT (1)"
( STDERR (erro padrão) tem descritor de arquivo predefinido igual a 2
e o descritor de arquivo STDOUT (saída padrão) é igual a 1)

> - é o mesmo que 1> e significa redirecionar STDOUT para algo

Em seguida, toda a operação será traduzida como:

command > /dev/null 2>&1 - redireciona os descritores de arquivo STDOUT e STDERR para o "buraco negro" ou basicamente ignora todas as saídas de command
("buraco negro" ou /dev/null é um dispositivo especial que aceita entrada e a ignora internamente)

Em relação a || true - Se command retornar status de saída não 0 (zero) (que geralmente indica algum tipo de erro / falha), true forçar definirá o código de status de saída como 0 (zero) indicando sucesso.

    
por 17.02.2017 / 13:17

Tags