在zsh中运行一个循环,如下所示,在输出中给出了空行(忽略了这个循环的重要性;它只是一个例子。一个更现实的例子可能正在运行mysql -s -e "show databases;"
并为每个数据库做一些事情)
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
,则不再显示空行。
答案 0 :(得分:3)
是的,〜/ .oh-my-zsh是罪魁祸首。进入〜/ .oh-my-zsh / lib / 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%<<"
}
我们看到它试图将标题设置为整个命令,包括命令后面的内容,删除像sudo这样的前缀,并执行一些像$和%这样的字符转义。但出于某种原因,当你做一只猫时,它会抛出一些换行符。为了快速解决这个问题,我只需将标题设置为$ CMD就可以了解哦-my-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
## Removing command argument parsing because of cat bug
#local LINE="${2:gs/$/\\$}"
#LINE="${LINE:gs/%/%%}"
#title "$CMD" "%100>...>$LINE%<<"
title "$CMD"
}
我在oh-my-zsh的github上回顾了这个文件的最新历史,但看起来这个bug已经有一段时间了。 “正确”的答案可能是围绕$ LINE进行一些嵌套扩展,删除空白和换行并向oh-my-zsh发出拉取请求。但是我的zsh foo仍然太弱了。
答案 1 :(得分:-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