Mám následující bash skript, z toho, čemu rozumím >>, se používá k přidání výstupu příkazu do existujícího souboru namísto přepsání, ale co dělá to v tomto případě? Tento skript volá některé soubory exe k převodu z jednoho formátu do druhého. Pro každý soubor existuje mnoho let, takže každý soubor prochází pohledem na název souboru. Také při spuštění tohoto skriptu dostanu „nejednoznačné přesměrování“
#!/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
Komentáře
- Jak se vám daří volat tento skript?
- možný duplikát Ambigous redirect done > $ 2
- @HaukeLaging, ne, není. Otázka se zdá být o něčem blízkém, ale ne o tom samém.
- @RomeoNinov Nevadilo by vám vysvětlit relevantní rozdíl?
- @HaukeLaging skript je uložen v souboru .sh. Jen napíšu ./myscript.sh
odpověď
1>>
a 2>>
jsou přesměrování pro konkrétní deskriptory souborů, v tomto případě standardní výstup (deskriptor souboru 1) a standardní chyba (deskriptor souboru 2).
Takže skript přesměrovává všechny „standardní“ zprávy na ${jobout}
a všechny chybové zprávy na ${joberr}
. Použití >>
v obou případech znamená, že všechny zprávy jsou připojeny k příslušným souborům.
Upozorňujeme, že ${jobout}
a ${joberr}
převezme jejich hodnoty ze dvou parametrů příkazového řádku do skriptu (${1}
a ${2}
) , takže musíte určit soubory, které chcete použít k uložení zpráv. Pokud parametry nejsou dané, skript vytvoří chybovou zprávu „nejednoznačné přesměrování“, kterou jste viděli; skript by měl opravdu zkontrolovat, zda byly zadány parametry, a jinak vytvořit příslušnou chybovou zprávu, něco jako
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
na začátku skriptu.
Odpověď
Ve vašem případě 1 >> připojte informace od aktuální obslužné rutiny stdout do souboru $ {jobout} 2 >> připojte informace ze současného obslužného programu stderr do souboru $ {joberr}
jobout a joberr jsou soubory definované jako první a druhý parametr skriptu
odpověď
Protože při volání skriptu neexistují žádné parametry, jsou parametry $1
a $2
prázdné a také jsou $jobout
a $joberr
.
Skript musíte zavolat takto:
./myscript.sh file1 file2
Komentáře
- Čísla parametrů nemají nic společného s čísly před
>>
operátory přesměrování . - Nevadí, vidím, že ' znovu odpovídáte na část o nejednoznačném přesměrování, nikoli na otázku v nadpisu. Pravděpodobně byste měli o tom objasnit svou odpověď.