在Unix上重定向标准错误输出

时间:2011-12-02 12:15:55

标签: unix standards

我创建了一个文件夹ABC。在这个文件夹中,我创建了两个文件,file1和file2。接下来在文件夹中我为每个人设置了rw权限。当我尝试ls ABC时,它会打印出来:

/bin/ls: cannot access ABC/file2: Permission denied

/bin/ls: cannot access ABC/file1: Permission denied

file1  file2

我想将此消息拆分为两部分,并写入文件success.txt和fail.txt。所以在Bash中,我尝试过类似的东西:

ls ABC > success.txt 2> fail.txt

但是在success.txt中我有“file1 file2”,但是fail.txt是空的,那么消息的前两行在哪里?


感谢Arne和shellter感兴趣。所以我用:

创建了这个文件夹
mkdir ABC

下一步:

 cd ABC
 touch file1 file2

下一步:

cd ..
chmod 666 ABC

当我输入ls ABC时,我得到了:

/bin/ls: cannot access ABC/file2: Permission denied

/bin/ls: cannot access ABC/file1: Permission denied

file1  file2

但是当我写一个sh脚本时,如:

#!/bin/sh
$* > success.txt 2> fail txt

fail.txt为空。为什么?我补充说,在另一种情况下一切正常,所以问题只在于命令在sterr和stdout上打印信息的地方。

2 个答案:

答案 0 :(得分:1)

我相信你已将ls定义为别名或shell函数。你有像

这样的东西吗?
alias ls='/bin/ls -l'

在您的某个启动文件中.bashrc.bash_profile)?

的输出是什么
type -a ls

ls ABC本身不应该给你那些错误信息; 666目录权限不会阻止它列出文件名。请尝试/bin/ls ABC进行确认。

您的别名或功能在shell脚本中不可见。

将stdout指向一个文件并将stderr指向另一个文件的语法是正确的。你只是运行一个不向stderr写任何东西的命令。

顺便说一下,在目录上设置666权限很少有意义。

答案 1 :(得分:1)

我认为您的系统ls配置为在输出到终端时使用颜色代码(通过环境变量,别名或功能)。如果需要颜色,lslstat每个需要目录搜索权限的文件。只列出文件名称不需要搜索权限。