redirecionando para / dev / null

105

Estou lendo um script de shell bash de exemplo:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

Estou tentando entender o uso de "/ dev / null 2 > & 1" aqui. No início, eu pensei que este script usa / dev / null para ignorar os erros, sem causar falhas no script (como tentar capturar o tratamento de exceções nas linguagens de programação). Porque eu não vejo como usar o tar para compactar um diretório em um arquivo tar poderia causar qualquer tipo de erro.

    
por JohnMerlino 14.03.2014 / 05:20

2 respostas

157

Não, isso não impedirá que o script falhe. Se ocorrer algum erro no processo tar (por exemplo, permissão negada, nenhum arquivo ou diretório, ...), o script ainda falhará.

Porque o uso de > /dev/null 2>&1 redirecionará toda a saída de comando ( stdout e stderr ) para /dev/null , significando que nenhuma saída será impressa no terminal.

Por padrão:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

No script, você usa > /dev/null causando:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

E então 2>&1 causando:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout
    
por 14.03.2014 / 05:35
17

I'm trying to understand the use of "> /dev/null 2>&1" here.

(note que adicionei o redirecionamento antes de /dev/null em sua pergunta.)

O texto acima redirecionaria os STDOUT e STDERR para /dev/null . Ele funciona mesclando o STDERR no STDOUT . (Essencialmente toda a saída do comando seria redirecionada para o dispositivo nulo . )

... without causing the script to crash (kind of like try catch exception handling in programming languages).

Não é bem como um try/catch ou algo assim. Simplesmente silencia qualquer tipo de saída (incluindo erro) do comando.

Because I don't see how using tar to compress a directory into a tar file could possibly cause any type of errors.

Isso pode resultar em erros por várias razões, incluindo:

  • Permissões inadequadas no (s) arquivo (s) que você está tentando arquivar ou no arquivo que você está tentando gravar em
  • Falta de espaço em disco para criar o arquivo
por 14.03.2014 / 05:28