O que significa / dev / null em um script de shell?

33

Comecei a aprender scripts de bash usando este guia: link

No entanto, fiquei preso no primeiro script:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Log files cleaned up."

O que as linhas 2 e 3 fazem no Ubuntu (eu entendo cat )? É apenas para outras distribuições Linux? Depois de executar este script como root, a saída que obtenho é Log files cleaned up. Mas /var/log ainda contém todos os arquivos.

    
por rishiag 22.08.2014 / 19:18

5 respostas

32

cat listará o conteúdo de um arquivo que sairá após cat para a saída padrão e o > enviará para o arquivo messages e wtmp , em que & gt; significa primeiro remover todo o conteúdo do arquivo e & gt; & gt; significaria adicionar ao arquivo atual. Neste caso, você está usando & gt; então o arquivo terminará vazio.

Agora para o kicker: /dev/null é um dispositivo que envia "nada" para os 2 arquivos por trás do & gt ;.

Existe uma razão para fazer assim: o arquivo NÃO é removido do sistema. Se você usasse rm e então fizesse um touch messages , as permissões poderiam estar erradas e se, logo após o rm , algo iria querer gravar no arquivo, o erro seria perdido. Dependendo de como o software é criado, ele pode falhar.

    
por Rinzwind 22.08.2014 / 19:46
43

Assumindo que os comandos foram bem-sucedidos, /var/log/messages e /var/log/wtmp ainda existem, mas estão em branco .

Redirecionamento da Shell

> é um operador de redirecionamento, implementado pelo shell. Sua sintaxe é:

command > file

Isso redireciona a saída padrão do command para file .

  • file também pode ser um nó de dispositivo .
  • Se file não existir, ele será criado como um arquivo regular .
  • Se file já existir como um arquivo normal e não estiver vazio, ele será sobrescrito. Esse é geralmente o caso dos comandos que você executou, nos quais você redirecionou a saída de cat /dev/null para messages e wtmp .
  • Se file já existir como um link simbólico , o destino do link é usado .
  • Se file já existir como um diretório, você receberá um erro como bash: file: Is a directory .

(É claro que essas operações podem falhar por outros motivos, como a falta de permissões ou um erro no sistema de arquivos.)

O operador de redirecionamento >> é semelhante, mas ele é anexado ao final de arquivos regulares não vazios, em vez de sobrescrever seu conteúdo. (Outro operador de redirecionamento é < .% Co_de% usa command < file como file 's introdução padrão .)

O dispositivo command

null é um dispositivo simples (implementado no software e não corresponde a nenhum dispositivo de hardware no sistema).

  • /dev/null parece vazio quando você lê a partir dele.
  • Escrever para /dev/null não faz nada: os dados gravados neste dispositivo simplesmente "desaparecem".

Geralmente, a saída padrão de um comando é silenciada redirecionando-o para /dev/null , e talvez esse seja o uso mais comum do dispositivo /dev/null no script de shell:

command > /dev/null

Você está usando null de maneira diferente. /dev/null gera o "conteúdo" de cat /dev/null , o que significa que sua saída está em branco. /dev/null (ou > messages ) faz com que essa saída em branco seja redirecionada para o arquivo no lado direito do operador > wtmp .

Como > e messages são arquivos regulares (em vez de, por exemplo, nós de dispositivo), eles são transformados em arquivos em branco (ou seja, esvaziados).

Você pode usar qualquer comando que não faça nada e não produza saída, à esquerda de wtmp .

Uma maneira alternativa de limpar esses arquivos seria executar:

echo -n > messages
echo -n > wtmp

O sinal > é obrigatório ou -n escreve um caractere nova linha .

(isso sempre funciona em echo . E eu acredito que o padrão bash em cada distribuição GNU / Linux e outro sistema similar ao Unix usado popularmente hoje em dia suporta o sh sinalizador no seu -n incorporado.Mas o jlliagre está certo que echo deve ser evitado para um script de shell verdadeiramente portátil, pois não é necessário que ele funcione . Talvez seja por isso que o guia que você está usando ensina o echo -n em seu lugar.

A cat /dev/null way é equivalente em seus efeitos, mas, sem dúvida, é uma solução melhor, pois é mais simples.
echo -n abre três "arquivos":

  • O executável cat /dev/null > file (geralmente cat ), um arquivo regular.
  • O /bin/cat device.
  • /dev/null

Por outro lado, file abre apenas echo -n > file ( file é um shell embutido).

Embora seja esperado que isso melhore o desempenho, esse não é o benefício - não apenas executando alguns desses comandos manualmente, de qualquer forma. Em vez disso, o benefício é que é mais fácil entender o que está acontecendo.

Redirecionamento e o comando trivial (em branco / vazio).

Como jlliagre apontou (veja também resposta do jlliagre ), isso pode ser reduzido ainda mais simplesmente omitindo o comando à esquerda de echo no total. Embora você não possa omitir o lado direito de uma expressão > ou > , o comando em branco é válido (é o comando que você está executando quando você pressiona Enter em um prompt vazio) e omitindo o lado esquerdo, você está apenas redirecionando a saída desse comando.

  • Observe que essa saída não contém uma nova linha.Quando você pressiona Enter em um prompt de comando - se você digitou alguma coisa ou não - o shell (executando de forma interativa) imprime uma nova linha antes de executar o comando emitido. Esta nova linha não faz parte da saída do comando.

O redirecionamento do comando em branco (em vez de >> ou cat /dev/null ) se parece com:

&gt messages
&gt wtmp
    
por Eliah Kagan 22.08.2014 / 20:05
11

Como já foi respondido, essas duas linhas estão limpando o conteúdo dos arquivos /var/log/messages e /var/log/wtmp , ou estão criando-os no caso improvável de ainda não existirem.

No entanto, eles são baseados em uma lenda urbana bem estabelecida que dá a /dev/null poderes "paranormais".

Na verdade, ele não tem nenhuma, então cat /dev/null é um desperdício de pressionamentos de tecla, tempo e ciclos de CPU, pois não gera absolutamente nada. A resposta de Eliah Kagan sugere a melhor abordagem que está usando echo -n . Isso é melhor, mas não é portável para alguns shells / SOs, onde pode colocar a string ' -n ' nesses arquivos.

Você pode ir mais longe e substituir esses comandos pelo portátil e mais simples:

cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."

Com a maioria dos shells (mas não os baseados em csh ), você pode ir ainda mais longe e remover o comando no-op ' : ':

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
    
por jlliagre 23.08.2014 / 10:47
5

> é o operador de redirecionamento de saída. Ele irá redirecionar a saída do comando para o arquivo mencionado após ele, em vez do dispositivo de saída padrão, truncando ou substituindo o conteúdo do arquivo.

por exemplo, ls -l > demo.txt . Depois de executar este comando, "demo.txt"  conterá o comando output ls -l .

Agora, a próxima coisa é o que é esse /dev/null . /dev/null é o arquivo nulo Is é um arquivo especial que não contém nada.

Então, quando você executa comandos

cat /dev/null > messages
cat /dev/null > wtmp

limpa o conteúdo do arquivo "messages" e "wtmp" sobrescrevendo o caractere EOF (End Of File).

Então, aqui você não está limpando o diretório /var/log , mas está limpando o conteúdo desses dois arquivos.

    
por g_p 22.08.2014 / 19:46
0

/ dev / null é como um buraco negro. As gravações feitas no / dev / null são descartadas. Neste script, eles estão usando / dev / null para esvaziar o arquivo de log de mensagens.

Caso contrário, eles poderiam simplesmente ter usado.

 > /var/log/messages.

Existem outras maneiras de esvaziar o conteúdo de um arquivo.

Como.

     truncate  -s  0  /var/log/messages
     cp  /dev/null  /var/log/messages

Mas usando "& gt;" ou "/ dev / null" é o caminho eficiente.

    
por MUTHUKUMAR SUBRAMANIAM 11.09.2016 / 19:40