zsh循环中的空行

时间:2013-05-28 13:07:19

标签: zsh

在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,则不再显示空行。

2 个答案:

答案 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