O que significa '1' e '2' em um script bash?

15

Eu tenho o seguinte script bash, pelo que entendi > > é usado para anexar a saída de um comando a um arquivo existente em vez de sobrescrever, mas o que ele está fazendo nesse caso? Este script está chamando alguns arquivos exe para converter de um formato para outro. Há muitos anos para cada arquivo, então ele percorre cada arquivo olhando o nome do arquivo. Além disso, quando executo esse script, recebo "redirecionamento ambíguo"

#!/bin/bash
source $HOME/.bashrc

jobout=${1}
joberr=${2}

# Set some paths and prefixes

yr_bgn=2000
yr_end=2000

yr=${yr_bgn}
pth_data='/mnt/'
pth_rst='/mnt/'



while [ ${yr} -le ${yr_end} ]
do
   ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable3 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   let yr=${yr}+1
done
    
por Herman Toothrot 05.02.2015 / 16:09

3 respostas

19

1>> e 2>> são redirecionamentos para descritores de arquivo específicos, neste caso, a saída padrão (descritor de arquivo 1) e erro padrão (descritor de arquivo 2).

Assim, o script está redirecionando todas as mensagens "padrão" para ${jobout} e todas as mensagens de erro para ${joberr} . Usar >> em ambos os casos significa que todas as mensagens são anexadas aos respectivos arquivos.

Observe que ${jobout} e ${joberr} levam seus valores dos dois parâmetros da linha de comando para o script ( ${1} e ${2} ), portanto, é necessário especificar os arquivos que você deseja usar para armazenar as mensagens. . Se os parâmetros não forem fornecidos, o script produzirá a mensagem de erro "Redirecionamento ambíguo" que você viu. o script deve realmente verificar se os parâmetros foram fornecidos e produzir uma mensagem de erro apropriada, algo como

if [ -z "$1" -o -z "$2" ]; then
    echo "Log files for standard and error messages must be specified"
    echo "${0} msgfile errfile"
    exit 1
fi

no início do script.

    
por 05.02.2015 / 16:14
2

No seu caso, 1 > > anexe as informações do manipulador stdout atual ao arquivo $ {jobout} 2 > > acrescente as informações do manipulador stderr atual ao arquivo $ {joberr}

jobout e joberr são arquivos, definidos como primeiro e segundo parâmetro do script

    
por 05.02.2015 / 16:20
1

Como não há parâmetros para chamar o script, os parâmetros $1 e $2 estão vazios, assim como $jobout e $joberr .

Você deve chamar o script assim:

./myscript.sh file1 file2
    
por 05.02.2015 / 17:07