我有一个小问题搞清楚如何获得错误输出并将其存储在一个variables或文件中的ksh。 所以在我的脚本中,我有一个while
循环内的cp -p source.file destination
。
当我得到下面的错误
cp: source.file: The file access permissions do not allow the specified action.
我想抓住它并将其存储在一个variables或文件中。
谢谢
你可以像这样重定向命令的错误输出:
cp -p source.file destination 2>> my_log.txt
它会将错误消息附加到my_log.txt文件。
如果你想要一个变量,你可以将stderr重定向到stdout,并将命令输出分配给一个变量:
my_error_var=$(cp -p source.file destination 2>&1)
在ksh中(和Q一样),就像在bash和其他sh衍生物中一样,你可以使用重定向从cp得到所有/只是stderr的输出,然后抓取一个var(使用$(),比使用最近版本时更好) :
output=$(cp -p source.file destination 2>&1)
CP不会正常输出任何东西,虽然这将捕获标准输出和标准错误; 以这种方式捕获stderr,也使用1>/dev/null
。 其他解决方案重定向到一个文件可以使用猫/各种其他命令来输出/处理日志文件。
我不建议使用输出到临时文件的原因:
重定向到一个文件然后阅读(通过读取命令或更低效地通过$(cat file)
),特别是对于一个单一的行,效率较低,速度较慢; 尽管如此,如果您想在显示错误之前每次追加多个操作,那么这个操作并不是那么糟糕。 除非总是清除临时文件,否则不要忘记何时中断(即Ctrl-C)或终止脚本。
使用临时文件也可能是一个问题,如果脚本一次运行多次(例如,可能通过cron发生,如果文件系统/其他延迟导致大量超限或仅来自多个用户),除非临时文件名是唯一的。
生成临时文件也是一个安全风险,除非非常小心,特别是如果文件数据被再次处理或内容可能被重写,然后显示其他内容混淆/钓鱼用户/打破脚本。 不要养成习惯,不要太随便,通过这里/谷歌的其他问题首先阅读临时文件(如mktemp)。
您可以通过执行以下操作来执行STDERR重定向:
command 2> /path/to/file.txt