Bash Stderr和Stdout重定向到文件不';无法从脚本中保存原始行编号

Bash Stderr和Stdout重定向到文件不';无法从脚本中保存原始行编号,bash,debugging,scripting,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>

我有剧本

#!/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时 我明白了


为什么lineno没有附加
stderr
?是否有一种方法可以将fileno信息附加到错误文件中。谢谢。

您无法真正获得自动行号,但如果您希望获得一些输出来帮助获得方位,您可以在
PS4
中使用带有行号的xtrace日志记录。这将使日志与正在运行的命令和行号交错:

#!/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

没有任何内容会自动从shell脚本写入行号。你所说的
fileno
是什么意思?@Barmar
$LINENO
如果你想写
$LINENO
,你必须明确地写出来
echo$LINENO这将转到/tmp/stderr.log
。不过,我不确定是否有好的方法将其放在变量赋值行上。它没有显示
uname+-a的行号,它只是在执行echo的位置显示相同的行号,这是12为什么您希望它显示行号?它只会在您回显时显示。太好了,有没有办法关闭
set-x
,因为命令(例如
uname-a
)不是连续的,因为在许多其他逻辑语句之间是连续的。我不想爬行到整个长度script@lazereyes
set+x
将关闭它并停止记录命令和行号
+ (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