Stderr和Stdout重定向到文件不会保存脚本中的原始行号

时间:2019-04-18 21:13:40

标签: bash debugging scripting

我的脚本为

#!/bin/bash
exec 3>&1 4>&2
exec 1>/tmp/stdout.log
exec 2>/tmp/stderr.log
echo "This goes to /tmp/stdout.log"
echo "This goes to /tmp/stderr.log" 1>&2       
cmd1="$(uname -a)"
cmd2="$(uname +-a)"
exec 1>&3 2>&4
exec 3>&- 4>&-

当我打开 stderr 时 我得到

This goes to /tmp/stderr.log
uname: extra operand `+-a'
Try `uname --help' for more information

为什么行号没有附加stderr?有没有一种方法可以将文件信息也附加到错误文件中。谢谢。

1 个答案:

答案 0 :(得分:1)

您实际上无法获得自动的行号,但是如果您希望获得一些输出来帮助了解您的方位,则可以将xtrace日志记录与行号在PS4中一起使用。这将使日志与正在运行的命令和行号交织:

#!/bin/bash
exec 3>&1 4>&2
exec 1>/tmp/stdout.log
exec 2>/tmp/stderr.log
PS4='+ (Line $LINENO) '
set -x
echo "This goes to /tmp/stdout.log"
echo "This goes to /tmp/stderr.log" 1>&2
cmd1="$(uname -a)"
cmd2="$(uname +-a)"
exec 1>&3 2>&4
exec 3>&- 4>&-

以下是错误日志,其中显示了已执行的命令和行号,因此您可以更轻松地了解+-a的来源:

+ (Line 7) echo 'This goes to /tmp/stdout.log'
+ (Line 8) echo 'This goes to /tmp/stderr.log'
This goes to /tmp/stderr.log
++ (Line 9) uname -a
+ (Line 9) cmd1='Linux localhost 4.14.0-3-amd64 #1 SMP Debian 4.14.17-1 (2018-02-14) x86_64 GNU/Linux'
++ (Line 10) uname +-a
uname: extra operand ‘+-a’
Try 'uname --help' for more information.
+ (Line 10) cmd2=
+ (Line 11) exec