Questão O que> / dev / null 2> & 1 || verdadeiro significado no Linux?


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

Agora eu entendo 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*


4


origem




Respostas:


TL; DR:  >/dev/null 2>&1 || true efetivamente silencia o comando, jogando fora 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ê.


Por padrão, os programas Linux recebem três descritores de arquivos que são abertos antes que o código principal do programa comece a ser executado. Esses 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, o que hoje significa efetivamente o teclado, tela e tela, respectivamente (mas nem sempre foi o caso).

Especificando > /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 começo), você especifica que a saída padrão (implícita 1, mas pode ser especificado usando 1> em vez de apenas >) deve ser redirecionado para gravar /dev/null, que descarta tudo o que está escrito para ele.

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ê quer redirecionar ambos stdout e stderr para o mesmo lugar é usar &> como em &> /dev/null. Isso não é suportado em todos os shells, no entanto.

Então, 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). Isto tem o efeito de silenciar o comando jogando fora toda a sua saída que é 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), então o shell invocará o comando do outro lado do ||, que neste caso é true. Não confunda isso com o tubo comum, que usa um único | e liga a stdout da esquerda ao stdin da direita. O oposto de || é && que executa o lado direito somente se o lado esquerdo retornou um status de saída de 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 é falseque sai com um status de falha (diferente de zero), mas por outro lado, como true, não faz nada.

Então, anexando || true depois de um comando, você sabe que, de qualquer forma, alguma coisa terá executado com sucesso no momento em que o conjunto de comandos tiver terminado a execução. Assim, você sabe que o código de status atual (disponível em $?) sempre indicará a execução bem-sucedida.


9





O que significa "comando"> / dev / null 2> & 1 || verdadeiro significado no Linux?

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

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

Então 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)

A respeito de || true - E se command retornar status de saída não 0 (zero) (que geralmente indica algum tipo de erro / falha) true código de status de saída do conjunto forçado para 0 (zero) indicando sucesso.


1



especificamente, 2>&1 significa "redirecionar STDERR (2) para STDOUT (1) ". - quixotic
@quixotic Obrigado! Adicionou sua nota à resposta. - Alex