Linux 避免Zsh重定向提示和无关的&x27;1';输出

Linux 避免Zsh重定向提示和无关的&x27;1';输出,linux,terminal,pipe,zsh,Linux,Terminal,Pipe,Zsh,我是一名经验丰富的Linux管理员和bash用户。也就是说,在给出以下命令的情况下,我无法理解zsh的行为 我希望下面的命令在各自的行上输出文件名: ls | for arg in $@ do echo ${arg} done 但是上面的命令会提示std重定向(std重定向以外的任何操作都会引发错误): 如果我尝试以下方法: ls | for arg in $@ do echo ${arg} done\n2&>1 然后我得到这个错误: zsh: parse error near

我是一名经验丰富的Linux管理员和bash用户。也就是说,在给出以下命令的情况下,我无法理解zsh的行为

我希望下面的命令在各自的行上输出文件名:

ls | for arg in $@ do echo ${arg} done
但是上面的命令会提示std重定向(std重定向以外的任何操作都会引发错误):

如果我尝试以下方法:

ls | for arg in $@ do echo ${arg} done\n2&>1
然后我得到这个错误:

zsh: parse error near `&>'
然而,如果我再次尝试

ls | for arg in $@ do echo ${arg} done
并在提示下输入:

pipe for>2&>1
然后,该命令通过以下操作成功完成:

1
filename1
filename2
filename3 
the rest the filenames
请注意,此命令写入一个名为“1”的空文件。在命令历史记录中向上滚动显示一行与我在上面尝试的内容相同:

ls | for arg in $@ do echo ${arg} done\n2&>1
但这次它起作用了

如果查看最近的历史记录,为什么键入以下命令失败,但等待提示并输入2&>1成功,尽管两者显示相同的字符

ls |对于$@do echo${arg}done\n2&>1中的arg

ls | for arg in $@ do echo ${arg} done\n2&>1
pipe for>2&>1
此外,为什么会这样做

ls | for arg in $@ do echo ${arg} done
是否仍会提示std文件重定向

注:我的最终目标基本上是:
ls |表示$@do if(filename=foo)中的文件名;然后cat$filename>>outfile.txt;fi

您在这里犯了几个错误。让我们一个接一个地看一遍

  • 你需要一个
    do
    done
    前面的换行符
  • 您不能通过管道连接到
    $@
    。如果您要使用管道,则需要阅读
    。例如,这项工作:
    
    ls |读取文件名时;做
    [[$filename==$~foo]]&&print$filename
    完成
    
  • 如果确实要使用
    $@
    ,则需要使用函数。例如,这也适用于:
    (){
    对于$@;do中的文件名
    [[$filename==$~foo]]&&print$filename
    完成
    }元(ls)
    
  • 然而,如果你无论如何都要使用,那么你就不需要使用函数了。上述内容可以这样重写: 文件名的
    ,单位为$(ls);做
    [[$filename==$~foo]]&&print$filename
    完成
    
但是以上这些都不是你想要实现的目标所必须的。如果要将与模式匹配的所有文件名打印到文本文件,则可以执行以下操作:

#`-l`将每个项目放在单独的行中。
#`*`匹配以数字结尾的所有文件。
打印-l-*>outfile.txt
奖金小费 如果提示
pipe for>
使您感到困惑,请尝试将其添加到
~/.zshrc
文件中:

export PS2=”请关闭此“%1”语句。^”
然后你会看到

$@do echo${arg}done中arg的
%ls |
请关闭此“for”语句^

您在这里犯了几个错误。让我们一个接一个地看一遍

  • 你需要一个
    do
    done
    前面的换行符
  • 您不能通过管道连接到
    $@
    。如果您要使用管道,则需要阅读
    。例如,这项工作:
    
    ls |读取文件名时;做
    [[$filename==$~foo]]&&print$filename
    完成
    
  • 如果确实要使用
    $@
    ,则需要使用函数。例如,这也适用于:
    (){
    对于$@;do中的文件名
    [[$filename==$~foo]]&&print$filename
    完成
    }元(ls)
    
  • 然而,如果你无论如何都要使用,那么你就不需要使用函数了。上述内容可以这样重写: 文件名的
    ,单位为$(ls);做
    [[$filename==$~foo]]&&print$filename
    完成
    
但是以上这些都不是你想要实现的目标所必须的。如果要将与模式匹配的所有文件名打印到文本文件,则可以执行以下操作:

#`-l`将每个项目放在单独的行中。
#`*`匹配以数字结尾的所有文件。
打印-l-*>outfile.txt
奖金小费 如果提示
pipe for>
使您感到困惑,请尝试将其添加到
~/.zshrc
文件中:

export PS2=”请关闭此“%1”语句。^”
然后你会看到

$@do echo${arg}done中arg的
%ls |
请关闭此“for”语句^

您缺少了
do
done
之前。将
ls
管道连接到一个不读取任何内容的循环有什么意义
$@
是脚本参数,而不是
ls
的输出。此处的
与重定向无关。它只是要求您完成for循环,因为
do
done
仅在语句开始时是特殊的(例如,在
之后),所以它认为您还没有进入循环体…而且。对*中的arg使用
;执行回显“$arg”;完成
。如果您想迭代行,这就是
while read
循环的作用(在bash中,更正确地编写类似于
while IFS=read-r arg;do echo“Doing thing with:$arg”;done
)。在任何shell中都存在同样的问题,而不仅仅是
zsh
。为什么不使用类似于
cat*foo*>outfile.txt的东西呢?祝你好运。你错过了
do
done
之前。将
ls
管道连接到一个不读取任何内容的循环有什么意义
$@
是脚本参数,而不是
ls
的输出。此处的
与重定向无关。它只是要求您完成for循环,因为
do
done
仅在语句开始时是特殊的(例如,在
之后),所以它认为您还没有进入循环体…而且。对*中的arg使用
;执行回显“$arg”;完成
。如果您想迭代行,这就是
while read
循环的作用(在bash中,更正确地编写类似于
while IFS=read-r arg;do echo“Doing thing with:$arg”;done
)。在任何shell中都存在同样的问题,而不仅仅是
zsh
。为什么不做点类似于你的东西呢
ls | for arg in $@ do echo ${arg} done