2011-07-05 49 views
2

ファイルを1行ずつ読み込み、読み取った内容に基づいて処理するスクリプトがあります。それがすることの1つは、リモートサーバーへのsshであり、いくつかの情報を取得します。何らかの理由でそれが私を完全に超えている場合、これはファイルからの行の読み取りを停止します。SSHのBashスクリプトの読み込みファイルの読み込み

スクリプトは本質的である(私は質問を簡素化するために、それの多くを切り取ってきたので、それはそれは本当に何もしていないように見える場合は心配しないでください):このスクリプト

cat $csv | while read line; do 
    shopt -s nocasematch 
    for j in "${file_list[@]}"; do 
     found=0; 
     for i in $(ssh some_server "ls /some_path/${line:0:1}/${line:1:1}/$line*"); do 
     if [[ $i =~ .*$j$ ]]; then 
      echo "do something"; 
      found=1; 
      break; 
     fi; 
     done; 
     if [[ $found -ne 1 ]]; then 
     echo "don't have $j"; 
     fi; 
     if [[ $found -ne 1 && $j == '\.pdf' ]]; then 
     getPDF $line ${dest}; 
     fi; 
    done; 
    shopt -u nocasematch 
done 

csvの最初の行でのみ実行されます。スクリプトの "ssh"部分を何か他のものに置き換えると、ファイルのすべての行ですべて実行されます。何がありますか?

+2

はsshをここにあなたの標準入力を(食べている、あなたの[猫の無駄な使用] (http://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat)は標準ですか? ssh -nを試してみてください... – Useless

+1

ファイルを1行ずつ読み込む際に 'read -r'を使用することを強くお勧めします。おそらく' while IFS = $ '\ n' read -r'空白があなたにとって重要であるならばそれで。 – Sorpigal

答えて

9

sshが消費されています。合格-n

+0

それはそうしました。ありがとう!将来これを見て、もっと説明が必要な人は、 "man ssh"を実行して-nオプションを調べてください。スクリプトの最終的な動作バージョンは上記と同じですが、sshの部分には "ssh -n some_server ..." – Eli

0

あなたがループ内(例えばsshなど)標準入力から読み込まれたコマンドを実行すると、あなたはどちらかということを確認する必要があります。

  • あなたのループはあなたのコマンドは、そのを持っていた
  • 標準入力を反復処理されていません標準入力リダイレクト:

元:

while read -u 5 -r; do 
    ssh "$REPLY" ... 
done 5<file 

... WHI CHは、bash 4.1以降を使用して、ように自動ファイルディスクリプタの割り当てを書き換えることができます。

while read -u "$file_fd" -r; do 
    ssh "$REPLY" ... 
done {file_fd}<file 

後者:

while read -r; do 
    ssh "$REPLY" ... </dev/null 
done <file 
関連する問題