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 substituir, mas o que está fazendo neste caso? Este script está chamando alguns arquivos exe para converter de um formato para outro. Há muitos anos para cada arquivo, portanto, ele percorre cada arquivo observando o nome do arquivo. Além disso, quando executo este 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
Comentários
- Como você chamar este script?
- possível duplicata de Redirecionamento ambíguo concluído > $ 2
- @HaukeLaging, não, não é. A questão parece ser sobre algo próximo, mas não é o mesmo
- @RomeoNinov Você se importaria de explicar a diferença relevante?
- @HaukeLaging o script é salvo em um arquivo .sh. Eu apenas digito ./myscript.sh
Resposta
1>>
e 2>>
são redirecionamentos para descritores de arquivo específicos, neste caso a saída padrão (descritor de arquivo 1) e o erro padrão (descritor de arquivo 2).
Então 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}
obtém seus valores dos dois parâmetros da linha de comando para o script (${1}
e ${2}
) , então você precisa 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 de “redirecionamento ambíguo” que você viu; o script deve realmente 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.
Resposta
No seu caso 1 >> anexe as informações do manipulador stdout atual ao arquivo $ {jobout} 2 >> anexe as informações do manipulador stderr atual para o arquivo $ {joberr}
jobout e joberr são arquivos, definidos como primeiro e segundo parâmetro do script
Resposta
Como não há parâmetros na chamada do script, os parâmetros $1
e $2
estão vazios e também $jobout
e $joberr
.
Você deve chamar o script desta forma:
./myscript.sh file1 file2
Comentários
- Os números dos parâmetros não têm nada a ver com os números anteriores aos
>>
operadores de redirecionamento . - Não se preocupe, vejo que você ' está respondendo à parte sobre o redirecionamento ambíguo, não à pergunta do título. Você provavelmente deve deixar sua resposta mais clara sobre isso.