我在弄清楚如何获取错误输出并将其存储在ksh中的变量或文件中时遇到了一些麻烦。所以在我的脚本中,cp -p source.file destination
循环中有while
。
当我收到以下错误时
cp: source.file: The file access permissions do not allow the specified action.
我想抓住它并将其存储在变量或文件中。
由于
答案 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