2013-05-28 1 views
1

Запуск цикла в zsh, как показано ниже, дает пустые строки на выходе (игнорируйте тривиальность этого цикла, это просто пример. Более реалистичный пример может быть запущен mysql -s -e "show databases;" и делать что-то для каждой базы данных).Пустые строки в цикле zsh

for foo in $(cat test.txt); do 
    echo $foo 
done 



alpha 
bravo 
charlie 
delta 

В этом примере, если test.txt имеет четыре линии, появляются три пустые строки. Если бы у него было пять строк, появлялось четыре пустые строки. В моем примере MySql было бы меньше пустых строк, чем в базе данных MySql.

Что вызывает эти пустые строки и как я могу их предотвратить? Запуск того же скрипта в Bash не дает пустых строк.


Редактировать: Похоже, Oh My Zsh является виновником, хотя я до сих пор не понял, почему. Если я прокомментирую source $ZSH/oh-my-zsh.sh в .zshrc, пустые строки больше не отображаются.

+1

Вы пробовали смотреть на результат своего скрипта с помощью 'set -x' или' #!/Bin/zsh -x' в начале его? – Alex

+0

@Alex: Спасибо за предложение. Запуск 'set -x' выводит TON, большинство из которых происходит от Oh My Zsh. Я еще не решил проблему, но она ведет меня в правильном направлении. – Jimothy

+0

вы можете установить 'set -x' перед кодом, который хотите просмотреть вывод отладки, и отключить его с помощью' set + x' after – Alex

ответ

2

Так что да, ~/.oh-мой-ЗШ является виновником. Переход в ~/.oh-мой-ЗШ/Библиотека/termsupport.zsh

#Appears at the beginning of (and during) of command execution 
function omz_termsupport_preexec { 
    emulate -L zsh 
    setopt extended_glob 
    local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd 
    local LINE="${2:gs/$/\\$}" 
    LINE="${LINE:gs/%/%%}" 
    title "$CMD" "%100>...>$LINE%<<" 
} 

Мы видим, что он пытается установить заголовок на всю команду, включая вещи, которые приходят после команды, срубая префиксы как Судо и выполнение некоторых экранов символов, таких как $ и%. Но по какой-то причине, когда вы делаете кошку, она бросает некоторые новые строки. Для быстрого решения, я ковылял о-мой-ЗШ немного, просто установив заголовок $ CMD, например, так:

#Appears at the beginning of (and during) of command execution 
function omz_termsupport_preexec { 
    emulate -L zsh 
    setopt extended_glob 
    local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd 
    ## Removing command argument parsing because of cat bug 
    #local LINE="${2:gs/$/\\$}" 
    #LINE="${LINE:gs/%/%%}" 
    #title "$CMD" "%100>...>$LINE%<<" 
    title "$CMD" 
} 

Я вернулся через недавно иш истории этого файла на oh-my-zsh's github, но похоже, что эта ошибка существует в течение некоторого времени. «Правильный» ответ, вероятно, заключается в том, чтобы сделать некоторое вложенное расширение вокруг $ LINE, которое удаляет пустые и новые строки и делает запрос на получение oh-my-zsh. Но мой zsh foo все еще слишком слаб для этого.

-1

Я бы предположил, что Bash как-то полностью отфильтровывает пробелы. Легкое решение для этого - немного пожать.

Пример:

for foo in $(grep -v '^$' test.txt); do 
    # The quotes are recommended to make sure you shell won't do weird things with the variables 
    echo "$foo" 
done 
+0

Это не сработало. Я не получаю никакого вывода, так как 'grep -v '' test.txt' ничего не выводит. Обратите внимание, что 'test.txt' не содержит пустых строк, но в конце каждой строки они имеют символы новой строки. Если я изменю содержимое, разделенное пробелами, а не новыми, я не получу пустые строки. Но 'cat'ing файл был просто примером; вывод фактической команды (такой как 'mysql) будет иметь в ней новые строки. – Jimothy

+0

'grep -v ''' должен отфильтровывать все пустые строки, но он не будет отфильтровывать все пробелы. Можете ли вы дать вывод первых строк 'cat test.txt | hexdump' (или что-то вроде 'cat text.txt' в вашем случае)? – Wolph

+0

@WoLpH Вы действительно пробовали 'grep -v '' test.txt' в файле? Действительно ли это делает то, что вы говорите? –