2013-05-28 45 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中运行相同的脚本不会产生空白行。


编辑:它出现的哦,我的岩组是罪魁祸首,虽然我还没有想通了,为什么。如果我在.zshrc中注释掉source $ZSH/oh-my-zsh.sh,则不再显示空白行。

+1

有你试图寻找在你的脚本输出,'设置-x'或在它的开始'#!/ bin中/ zsh的-x'? – Alex

+0

@亚历克斯:感谢您的建议。运行'set -x'输出TON的东西,大部分来自Oh My Zsh。我还没有解决这个问题,但它带领我朝着正确的方向前进。 – Jimothy

+0

您可以设置'设置-x'要查看调试输出的代码之前,并与禁用它'设置+ x'事后 – Alex

回答

2

所以,是的,〜/·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,像这样蹒跚哦,我-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,但它似乎已经存在一段时间了。 “正确的”答案可能是在$ LINE周围进行一些嵌套扩展,删除空白和换行符,并向oh-my-zsh发出拉取请求。但我的zsh foo对此仍然太弱。

-1

我会认为是bash不知何故完全过滤掉空格。一个简单的解决方法是grep一点。

例子:

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'不包含任何空行,但每行末尾都有换行符。如果我将内容更改为以空格分隔而不是换行符,则不会看到空行。但是'猫'文件只是一个例子。实际命令(如'mysql)的输出将会有换行符。 – Jimothy

+0

了'grep的-v''应该过滤掉所有空行,但不会过滤掉所有的空白。你可以给出'cat test.txt |的第一行的输出hexdump'(或者任何'cat text.txt'在你的情况下)? – Wolph

+0

@WoLpH你有没有在文件上试过'grep -v''test.txt'?它实际上是做你说的吗? –