ウィキペディアのURLを引数(wiki_txt_script.sh)として受け取り、wgetを使用してページからテキストを受け取るbashスクリプトがあります。-rオプションを指定して呼び出すと、テキスト内からリンクされているページのテキストを使用するかどうかをユーザーに確認し、選択したURLを1行に1つずつ一時ファイルに入れます。これらのページからもテキストを取得するために、各URLでスクリプトを再帰的に呼び出すループを作成しました。
while read line; do
echo $line
wiki_txt_script.sh -w $line
echo finished a recursive call
done <temp_links.txt
ただし、これは1回だけループし、temp_links.txtの最初のURLからテキストを正常に取得しているように見えます(再帰呼び出し後もループ内でechoコマンドを実行しています)が、ループは終了し、temp_linksの他の行は呼び出されません。 。txt。再帰呼び出しをループから削除すると、各行をループし、期待どおりに内容をエコーします。再帰呼び出しが存在するときにループが早期に終了する原因は何ですか?
編集:チャールズの答えは私の問題を解決しました。ただし、dev / nullでスクリプトを使用した後、端末への出力の各行は、端末への出力の最後の行の終わりから始まりました。スクリプトが終了し、次のように表示されると、これは他のコマンドでも続行されます。
新しいセッションを開始すると、これは簡単になくなります。なぜこれが起こったのかについて何か考えはありますか?
これは再帰とは何の関係もありません。コードが繰り返し発生する場合は、最初の行がtemp_links.txt
何度も書き込まれる無限ループが発生します。
while read
行が存在するときにループが早期に終了する明らかな理由は、その行がすべてのstdinを消費し、次のread
呼び出しのために何も残さないことです。
これを回避するには、この障害の原因となるコマンドのstdinをリダイレクトします。
wiki_txt_script.sh -w "$line" </dev/null
...または読み取りに非stdinファイル記述子を使用します。
while read line <&3; do
...
done 3< temp_links.sh
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加