2012-03-12 8 views
1

なぜこれが起こっているのかわからないのですが、bashはwhileループで実行中にコマンドを削除するようです。 私は次のスクリプトを持っている:私はseperatlyコマンドを実行したときにBashはwhileコマンドを削除していますか?

adb shell ls /foo/bar | while read file 
do 
    folder="/foo/bar/$file"                                                              
    adb pull $folder download 
done 

、それは素晴らしい作品。しかし、このように実行すると、次のような出力が得られます。

' does not existfoo/bar/filesdfsdf.sdf 

/foo/barのすべてのファイルに対してです。

ので、私は私に戻って文字列としてコマンドを与えることを試みたが、私はecho "adb pull $folder download"に変更し、次の出力ました:行ごとに

download/foo/bar/fileasdfs.sdf 

を。 bashは文字列を使って何かを行い、ここにいくつかのものを置き換えているようです... もし私が'を使用していれば、bashの置き換えは起こりません。正しい出力が得られます。

ここには何が起こっているのですか?

編集:私はwhileが直接壊れていないことを知りました。そのすべての行末にCRLFをエコーするコマンドがadb shellです。私は

adb shell ls /foo/bar | tr -d '\015' | while read file 
do 
    folder="/foo/bar/$file"                                                              
    adb pull $folder download 
done 

を使用している場合、それは働きます! しかし、なぜbashはCRLFにアレルギーがあるのですか?そして、なぜその削除が完了するのか?

+0

あなたのフォルダvar、つまり 'echo adb pull" $ folder "download'を引用してみてください。あなたが望む結果が得られるまで、 'echo'を使うことをお勧めします。がんばろう。 – shellter

+1

ok woot lol、私はadbがCRLFを使って新しい行をエコーアウトしていることを理解しました...私がそうするとクレイジーになり、コマンドoOをストライプします。私は 'を追加しました| tr -d '\ 015' 'を実行して、adbシェル出力からすべてのCRを削除します。 whileはなぜCRを許可しないのですか? – reox

答えて

1

"CRを許可しないのはなぜですか?"という言い回しがわかりません。正しい質問は「CRで読んだことは何ですか?」です。そうでないと述べていない限り、readはパラメータ分割にCRを使用します。変数IFSについては、bash-manualを見て、-dオプションを見てください。

例:

ここ
bos:$ echo foo bar gazonk | while read x ; do echo $x ; done 
foo bar gazonk 

、CRはread用(デフォルト)デリミタとして機能します。さて、あなたは(区切り文字としてSPCを設定)-d " "を使用することになり、あなたはすべての単語での読み取りを分割したいと言う:

$ echo foo bar gazonk hello 123 | while read -d " " x ; do echo $x ; done 
foo 
bar 
gazonk 
hello 

ここで、裏面にはそれがないので、最後のパラメータ(123)が出力されないということです区切り文字で終わります。区切り文字は、その次の区切り文字を含めてそれまでのすべてを把握するものと考えてください。 "123"は区切り文字で終わらないので、最後の区切り文字は "hello"と "123"の間にあります。したがって、区切られた区切り文字は "hello"です。

関連する問題