Bash удаляет команды в то время как? - PullRequest
1 голос
/ 12 марта 2012

Я действительно не понимаю, почему это происходит, 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 Ответ

1 голос
/ 13 марта 2012

Я не знаю, что вы подразумеваете под «Почему не разрешают CR?».Правильный вопрос: «Что читать с CR?».Если не указано иное, read использует CR для разделения параметров.Посмотрите в вашем bash-руководстве переменную 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» не заканчивается разделителем, последний разделитель находится между «привет» и «123», и, таким образом, то, что захватывается, является «привет», потому что он имеет разделитель слева и справа от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...