Bash-stderr填满的原因?

Bash-stderr填满的原因?,bash,stderr,Bash,Stderr,我写了一个脚本,它可以正常工作,但由于某种原因,stderr中充满了一些东西。有什么可以进去,我怎样才能防止它发生 这是我的脚本,它的第一个参数是目录,下一个参数是人名 #/bin/bash 作者=$# args=(“$@”) (i=1;i

我写了一个脚本,它可以正常工作,但由于某种原因,stderr中充满了一些东西。有什么可以进去,我怎样才能防止它发生

这是我的脚本,它的第一个参数是目录,下一个参数是人名

#/bin/bash
作者=$#
args=(“$@”)
(i=1;i

谢谢大家!

find
grep
这样的命令可能会遇到各种各样的情况,这些情况可能是意外的,或者没有反映在写入
stdout
的输出中。为了通知用户这种情况,将向
stderr
写入警告,例如:

grep: Binary file [...] matches
find: `[...]': Permission denied
在交互式会话中,写入
stderr
的消息通常显示在终端中,即使
stdout
被重定向,例如:

mj@ap:/tmp$ find > results
find: `./cron-apt.Ex7jHf': Permission denied
或在变量中捕获,例如:

mj@ap:/tmp$ results=$( find )
find: `./cron-apt.Ex7jHf': Permission denied
您还可以重定向
stderr

find >results 2>errorfile  # redirect stderr to errorfile
find >results 2>/dev/null  # discard stderr
find >results 2>&1         # include stderr in results
分别为:

results=$( find 2>errorfile ) # redirect stderr to errorfile
results=$( find 2>/dev/null ) # discard stderr
results=$( find 2>&1 )        # include stderr in results

有关重定向的更多信息,请参见手册页
bash(1)

我终于找到了问题所在:

在第二个for循环中,我试图只遍历目录。但是for循环也会对文件进行迭代。因此,变量
results
在某些迭代中尝试使用
$D
中的文件而不是目录执行脚本
get_test_stats
,因此失败

以下是固定代码:

#/bin/bash
作者=$#
args=(“$@”)
(i=1;i
所以要回答这个问题:在作业中,我们被告知如果要填充
stderr
,可能是因为bash中有无效语法,或者有一个带有无效参数的标准命令。
所以你要仔细检查一下。

什么是
stderr
?错误消息是什么?此外,循环也无法跳过初始目录。该脚本将多次运行
find
。你的
grep
是否不支持
-r
?@Etan Reisner:我不知道stderr是用什么填充的,我怎么检查?循环不是故意通过目录的。我和find有些不同,我可以把它改回来什么让你觉得它被什么东西填满了?@GalFl你可以通过在命令行末尾添加2>&1将stderr重定向到stdout,比如:
/script.bsh 2>&1
你有一个检查脚本,它报告
stderr
正在被写入,但不报告其内容
stderr
?这是糟糕的行为。谢谢你的详细回复。然而,似乎没有什么能解决问题。正如我提到的,我的代码工作得很好,但stderr似乎充满了未知数据。我试图按照这里的建议添加2>&1,但常规输出中没有显示任何其他内容。@GalFl:如果您将脚本作为一个整体运行,并将其stderr重定向到一个文件(例如
errorfile
),并且该文件在终止后为空(请检查
wc-c errorfile
,应显示
0
)那么问题很可能不在脚本中(除非它包含关于如何调用它的条件,例如,如果存在tty)。接下来我要看的是您的checker脚本,如果涉及到第三个程序:可能它通过shell调用您的脚本,shell执行命令(在其初始化文件或提示命令中,…),在
stderr
上创建不必要的输出。