采用:
ls | xargs -t -i{} echo {} 2>&1 >/dev/null
将2>&1
标准错误从xargs
标准输出发送到当前的位置;将>/dev/null
原始标准输出发送到/dev/null
. 因此,最终结果是标准输出包含回显命令,并/dev/null
包含文件名。sed
我们可以讨论文件名中的空格以及使用脚本将“echo”放在每行的前面是否更容易(没有-t
选项),或者您是否可以使用:
ls | xargs -i{} echo echo {}
(测试:Solaris 10,Korn Shell ;应该可以在其他 shell 和 Unix 平台上工作。)
如果您不介意查看命令的内部工作原理,我确实设法将错误输出xargs
与执行的命令的错误输出分开。
al * zzz | xargs -t 2>/tmp/xargs.stderr -i{} ksh -c "ls -dl {} 2>&1"
(非标准)命令al
每行列出一个参数:
for arg in "$@"; do echo "$arg"; done
第一个重定向 ( 2>/tmp/xargs.stderr
) 将错误输出发送xargs
到文件/tmp/xargs.stderr
。执行的命令是 ' ksh -c "ls -dl {} 2>&1"
',它使用 Korn shellls -ld
在文件名上运行,任何错误输出都会转到标准输出。
中的输出/tmp/xargs.stderr
如下所示:
ksh -c ls -dl x1 2>&1
ksh -c ls -dl x2 2>&1
ksh -c ls -dl xxx 2>&1
ksh -c ls -dl zzz 2>&1
我使用 ' ls -ld
' 代替echo
来确保我正在测试错误 - 文件x1
、x2
和xxx
存在,但zzz
不存在。
标准输出上的输出如下所示:
-rw-r--r-- 1 jleffler rd 1020 May 9 13:05 x1
-rw-r--r-- 1 jleffler rd 1069 May 9 13:07 x2
-rw-r--r-- 1 jleffler rd 87 May 9 20:42 xxx
zzz: No such file or directory
在没有包含在“ ”中的命令的情况下运行时ksh -c "..."
,I/O 重定向作为参数传递给命令(“ ls -ld
”),因此它报告它找不到文件“ 2>&1
”。也就是说,xargs
它本身并不使用 shell 来进行 I/O 重定向。
可以安排各种其他重定向,但基本问题是xargs
没有规定将自己的错误输出与其执行的命令分开,因此很难做到。
另一个相当明显的选择是使用xargs
编写一个 shell 脚本,然后让 shell 执行它。这是我之前展示的选项:
ls | xargs -i{} echo echo {} >/tmp/new.script
然后,您可以使用以下命令查看命令:
cat /tmp/new.script
您可以运行命令以丢弃错误:
sh /tmp/new.script 2>/dev/null
而且,如果您也不想看到命令的标准输出,请附加1>&2
到命令的末尾。