私が理解していることから、次のbashスクリプトがあります>>は、コマンドの出力を上書きする代わりに既存のファイルに追加するために使用されますが、この場合はやっていますか?このスクリプトは、いくつかのexeファイルを呼び出して、ある形式から別の形式に変換します。各ファイルには何年もあるので、ファイル名を見て各ファイルをループします。また、このスクリプトを実行すると、「あいまいなリダイレクト」が発生します
#!/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
コメント
- どうしますかこのスクリプトを呼び出しますか?
- の重複の可能性> $ 2
- @HaukeLaging、そうではありません。質問は何か近いもののようですが、同じではありません
- @RomeoNinov関連する違いを説明していただけませんか?
- @HaukeLagingスクリプトは.shファイルに保存されます。 ./myscript.sh
回答
1>>
と2>>
は、特定のファイル記述子、この場合は標準出力(ファイル記述子1)と標準エラー(ファイル記述子2)のリダイレクトです。
つまり、スクリプトは、すべての「標準」メッセージを${jobout}
にリダイレクトし、すべてのエラーメッセージを${joberr}
にリダイレクトします。どちらの場合も>>
を使用すると、すべてのメッセージがそれぞれのファイルに追加されます。
${jobout}
と
は、2つのコマンドラインパラメータからスクリプトに値を取得します(${1}
および${2}
) 、したがって、メッセージの保存に使用するファイルを指定する必要があります。パラメータが指定されていない場合、スクリプトは「あいまいなリダイレクト」エラーメッセージを生成します。スクリプトは、パラメータが提供されているかどうかを実際にチェックし、そうでない場合は、スクリプトの開始時に
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
のような適切なエラーメッセージを生成する必要があります。
回答
あなたの場合1 >>現在のstdoutハンドラーからの情報をファイルに追加します$ {jobout} 2 >>情報を追加します現在のstderrハンドラーからファイルへ$ {joberr}
joboutとjoberrはファイルであり、スクリプトの1番目と2番目のパラメーターとして定義されます
回答
スクリプトの呼び出しにはパラメーターがないため、パラメーター$1
と$2
は空です。 $jobout
および$joberr
。
次のようにスクリプトを呼び出す必要があります:
./myscript.sh file1 file2
コメント
- パラメータ番号は、
>>
リダイレクト演算子の前の番号とは関係ありません。 。 - 気にしないでください。タイトルの質問ではなく、あいまいなリダイレクトに関する部分に'回答しているようです。あなたはおそらくこれについてあなたの答えをより明確にするべきです。