3

我在弄清楚如何获取错误输出并将其存储在 ksh 中的变量或文件中时遇到了一些麻烦。所以在我的脚本中,我有cp -p source.file destination一个while循环。

当我收到以下错误

cp: source.file: The file access permissions do not allow the specified action.

我想抓住它并将其存储在变量或文件中。

谢谢

4

3 回答 3

4

您可以像这样重定向命令的错误输出:

cp -p source.file destination 2>> my_log.txt

它将错误消息附加到 my_log.txt 文件中。

如果您需要一个变量,您可以将 stderr 重定向到 stdout 并将命令输出分配给一个变量:

my_error_var=$(cp -p source.file destination 2>&1)
于 2012-06-07T18:50:35.363 回答
1

在 ksh 中(根据 Q),如在 bash 和其他 sh 衍生物中,您可以使用重定向从 cp 获取所有/仅 stderr 输出,然后在 var 中获取(使用 $(),如果使用模糊的最新版本,则比反引号更好) :

output=$(cp -p source.file destination 2>&1)

cp 通常不会输出任何内容,尽管这会捕获 stdout 和 stderr;要以这种方式捕获 stderr,1>/dev/null也可以使用。重定向到文件的其他解决方案可以使用 cat/各种其他命令来输出/处理日志文件。

我不建议使用输出到临时文件的原因:

重定向到一个文件然后读取它(通过 read 命令或更低效地通过$(cat file)),特别是对于单行,效率较低且速度较慢;虽然如果您想在显示错误之前每次都附加到它以进行多次操作,但还不错。除非您总是将其清除,否则您还将保留临时文件,不要忘记人们何时中断(即 Ctrl-C)或终止脚本。

如果脚本一次运行多次,使用临时文件也可能是一个问题(例如,如果文件系统/其他延迟导致大量溢出或仅来自多个用户,则可能通过 cron 发生),除非临时文件名是唯一的。

除非非常小心,否则生成临时文件也是一种安全风险,特别是如果再次处理文件数据或内容可能在显示之前被其他东西重写以混淆/钓鱼用户/破坏脚本。不要养成太随便的习惯,首先通过此处/google 的其他问题阅读临时文件(例如 mktemp)。

于 2012-06-07T18:53:03.913 回答
0

您可以通过执行以下操作进行 STDERR 重定向:

command 2> /path/to/file.txt
于 2012-06-07T18:48:40.517 回答