Bash “中的负是什么意思?”;执行官3>&-&引用;我如何使用它?
我经常很难弄清楚某些语言结构,因为在谷歌或Duckback上搜索时它们不会注册。通过一些实验,通常很容易弄明白,但我不明白这一点 我经常在bash脚本中看到像Bash “中的负是什么意思?”;执行官3>&-&引用;我如何使用它?,bash,redirect,terminal,stdout,sh,Bash,Redirect,Terminal,Stdout,Sh,我经常很难弄清楚某些语言结构,因为在谷歌或Duckback上搜索时它们不会注册。通过一些实验,通常很容易弄明白,但我不明白这一点 我经常在bash脚本中看到像2>&1或3>&-这样的东西。我知道这是某种重定向。1为标准输出,2为标准输出。3可能是习惯。但缺点是什么 另外,我有一个脚本,我想记录它的输出,但也希望在屏幕上看到它。我使用exec>>(tee$LOGFILE);执行2>&1。它起作用了。但有时当我使用bashtrap编写这个脚本时,我就不能再在提示符下键入了。输出在Ctrl+C之后隐藏
2>&1
或3>&-
这样的东西。我知道这是某种重定向。1为标准输出,2为标准输出。3可能是习惯。但缺点是什么
另外,我有一个脚本,我想记录它的输出,但也希望在屏幕上看到它。我使用exec>>(tee$LOGFILE);执行2>&1
。它起作用了。但有时当我使用bashtrap编写这个脚本时,我就不能再在提示符下键入了。输出在Ctrl+C
之后隐藏。我可以使用自定义频道和减号来修复此问题,还是与此无关
2>&1
表示stderr被重定向到stdout3>&-
表示为写入而打开的文件描述符3(与stdout相同)已关闭3>和-
关闭文件描述符编号3(它可能以前使用3>文件名打开过)
2>&1
将文件描述符2(stderr)的输出重定向到与文件描述符1(stdout)相同的目标。这将导致调用dup2()
syscall
有关重定向文件描述符的更多信息,请参阅bash手册页(`manbash)。它们很密集,但很伟大
对于您的脚本,我会这样做:
#!/bin/bash
if [[ -z $recursive_call ]]; then
recursive_call=1
export recursive_call
"$0" "$@" | tee filename
exit
fi
# rest of the script goes there
但它会丢失脚本中的退出代码。我想在bash中有一种方法可以得到它,但我现在记不起来了。您得到了两个准确的答案。该文件还涵盖了这些符号的使用,并解释了为什么海贝应该留在海边,而不是用于编写脚本。