Linux 使用Bash重定向管道中的错误时出现问题?

Linux 使用Bash重定向管道中的错误时出现问题?,linux,bash,ls,Linux,Bash,Ls,所以我使用这个命令从/etc/获取所有.conf文件。我希望输出为total_size.txt,我的错误为error.txt。我的输出看起来不错,但错误不会重定向到error.txt,它们出现在我的终端中: ls -lhR /etc/ | egrep *.conf$ >/home/student/total_size.txt 2>/home/student/error.txt 我不知道该怎么办;我尝试了2>而不是2>,但它也不起作用。发生这种情况是因为ls的stderr仍然指向终端

所以我使用这个命令从
/etc/
获取所有.conf文件。我希望输出为
total_size.txt
,我的错误为
error.txt
。我的输出看起来不错,但错误不会重定向到
error.txt
,它们出现在我的终端中:

ls -lhR /etc/ | egrep *.conf$ >/home/student/total_size.txt 2>/home/student/error.txt

我不知道该怎么办;我尝试了
2>
而不是
2>
,但它也不起作用。

发生这种情况是因为
ls
的stderr仍然指向终端。您需要用大括号将管道包裹起来,并在外部执行重定向。例如:

ls: cannot open directory '/etc/cups/ssl': Permission denied

试试这个,应该可以

{ ls -lhR /etc/ | egrep *.conf$; } >/home/student/total_size.txt 2>/home/student/error.txt

错误是由
ls
产生的,而不是
egrep

egrep的stderr仍然连接到终端。如果失败了怎么办?您应该能够再次为egrep重定向stderr。egrep*.conf$1>/home/student/total_size.txt 2>/home/student/error.txt由于ls的stdout被egrep使用,因此输出重定向也可以放在大括号之外。相关的,
grep-E
egrep
更便于移植。另见。
ls -lhR /etc/ 2>>/home/student/error.txt | egrep *.conf$ >/home/student/total_size.txt