Bash正在删除命令吗?

时间:2012-03-12 08:57:03

标签: bash replace

我真的不明白为什么会发生这种情况,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直接被破坏,而是adb shell命令在每一行结束时回复CRLF。如果我使用

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

它有效! 但为什么bash对CRLF过敏呢?为什么它会删除命令?

1 个答案:

答案 0 :(得分:1)

我不知道你的意思是“为什么不允许CR?”。正确的问题是“读取CR的内容是什么?”。除非另有说明,read使用CR进行参数分割。在bash-manual中查看变量IFS,并查看要读取的-d选项。

示例:

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

此处,CR充当read的(默认)分隔符。现在,假设您想要在每个单词上拆分读取,那么您将使用-d " "(将SPC设置为分隔符):

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

这里的背面是不输出最后一个参数(123),因为它不以分隔符结束。将分隔符想象为抓取它的所有左边,但不包括下一个分隔符。由于“123”不以分隔符结尾,因此最后一个分隔符位于“hello”和“123”之间,因此 - 抓取的是“hello”,因为它有一个左边和右边的分隔符。