我有简单命令的错误结果:
cp -R SourceDir DestDir 2>out.txt
result="out.txt"
但是如果脚本没有写入权限,我怎么能在变量结果中得到错误输出?
答案 0 :(得分:4)
一种选择是将文件写入您有权限的位置:
cp -R SourceDir DestDir 2>${TMPDIR:-/tmp}/out.$$.err
另一种选择是捕获变量中的错误(和非错误)输出:
output=$(cp -R SourceDir DestDir 2>&1)
echo "$output"
请注意,第一个变体会创建特定于流程的临时文件。因此生成的文件名不是很安全;如果您以root用户身份在恶意环境中工作,则需要采取更多预防措施来生成容易预测的文件名。对于大多数用户而言,大多数时候都是足够的,特别是如果$TMPDIR
环境变量指向某些目录,例如其他用户无法写入的$HOME/tmp
。使用包含$$
的名称可确保如果两个人同时运行脚本,则不会意外干扰彼此的日志文件。
如果过程中断,您还应该采取预防措施来清理文件。这个样板的方法显示在这个样板(模板)中:
tmp=${TMPDIR:-/tmp}/out.$$.err
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # EXIT HUP INT QUIT PIPE TERM
# Command using temporary file
cp -R SourceDir DestDir 2>$tmp
# Analyse contents...
# Clean up
rm -f $tmp
trap 0
exit 0
您可以退出非零状态(exit $status
);关键点是删除文件,然后取消'退出时的陷阱'。信号HUP,INT,QUIT,PIPE和TERM是最有可能接收进程的信号,在所有这些情况下,shell删除临时文件并以非零状态退出(示例中为1)。
答案 1 :(得分:1)
cp -R SourceDir DestDir 2>out.txt
[ $? -eq 0 ] && { result="out.txt" } || echo 'no permission'