Linux 避免Zsh重定向提示和无关的&x27;1';输出
我是一名经验丰富的Linux管理员和bash用户。也就是说,在给出以下命令的情况下,我无法理解zsh的行为 我希望下面的命令在各自的行上输出文件名: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
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