如何获取错误输出并将其存储在变量或文件中

时间:2012-06-07 18:45:19

标签: shell unix permissions

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

当我收到以下错误时

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

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

由于

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

在ksh中(根据Q),就像在bash和其他sh派生词中一样,你可以使用重定向从cp获取所有/只是stderr输出,然后在var中使用(使用$(),如果隐约使用,则优于反引号最新版本):

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

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

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

重定向到一个文件然后读取(通过读取命令或更低效地通过$(cat file)),特别是对于一行而言,效率较低且速度较慢;如果你想在显示错误之前每次都要附加多个操作,那就不是那么糟糕了。你也会留下临时文件,除非你总是清理它,不要忘记人们中断(即Ctrl-C)或杀死脚本。

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

生成临时文件也是一种安全风险,除非非常谨慎地进行,特别是如果再次处理文件数据或者在显示之前可以重写内容以混淆/欺骗用户/破坏脚本。不要习惯于太随意地做这件事,首先通过其他问题/ google阅读临时文件(例如mktemp)。

答案 2 :(得分:0)

您可以执行以下操作来执行STDERR重定向:

command 2> /path/to/file.txt