O que `1 >>` e `2 >>` significam em um script bash?

15

Eu tenho o seguinte script bash, pelo que entendo >> é usado para anexar a saída de um comando a um arquivo existente em vez de substituir, mas o que 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 observando 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
Herman Toothrot
fonte
Como você chama esse script?
Hauke ​​Laging
possível duplicação do redirecionamento ambíguo feito> $ 2
Hauke ​​Laging 5/15/15
@HaukeLaging, não, não é. A questão parece ser sobre algo próximo, mas não é o mesmo #
Romeo Ninov
@RomeoNinov Você se importaria de explicar a diferença relevante?
Hauke ​​Laging
@HaukeLaging o script é salvo em um arquivo .sh. Eu apenas digite ./myscript.sh
Herman Toothrot

Respostas:

19

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

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

Observe que ${jobout}e ${joberr}leve seus valores dos dois parâmetros da linha de comando para o script ( ${1}e ${2}), portanto, você deve especificar os arquivos que 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 realmente deve verificar se os parâmetros foram fornecidos e produzir uma mensagem de erro apropriada, caso contrário, 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.

Stephen Kitt
fonte
2

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

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

Romeo Ninov
fonte
1

Como não há parâmetros em chamar o script os parâmetros $1e $2estão vazios e por isso são $joboute $joberr.

Você deve chamar o script assim:

./myscript.sh file1 file2
Hauke ​​Laging
fonte
Os números dos parâmetros não têm nada a ver com os números antes dos >>operadores de redirecionamento.
Barmar
Não importa, vejo que você está respondendo a parte sobre o redirecionamento ambíguo, não a pergunta no título. Você provavelmente deve deixar sua resposta mais clara sobre isso.
Barmar