减号在"exec 3>&-"中是什么意思,我该如何使用它?



我经常很难弄清楚某些语言结构,因为它们在谷歌搜索或躲避时不会注册。通过一点实验,通常很容易弄清楚,但我不明白这一点。

我经常在bash脚本中看到类似2>&13>&-的东西。我知道这是某种重定向。1是stdout,2是stderror。3可能是惯例。但是负是什么呢?

此外,我有一个脚本,我想记录它的输出,但也想在屏幕上看到。我使用exec > >(tee $LOGFILE); exec 2>&1。它有效。但有时当我破解这个脚本时,我无法再在提示下键入了。输出在Ctrl+C之后隐藏。我可以使用自定义通道和减号来解决这个问题吗?还是它无关?

  1. 2>&1表示stderr被重定向到stdout
  2. 3>&-表示打开进行写入的文件描述符3(与stdout相同(已关闭

你可以在这里看到更多重定向的例子

  1. 至于第三个问题,我认为这是一个很好的链接

3>&-关闭编号为3的文件描述符(它可能以前用3>filename打开过(。

2>&1将文件描述符2(stderr(的输出重定向到与文件描述符1(stdout(相同的目标。这将调用dup2()系统调用。

有关重定向文件描述符的更多信息,请参阅bash手册页(`man-bash(。它们密度很大,但很棒。

对于你的剧本,我会这样做:

#!/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中有一种方法可以得到它,但我现在记不起来了。

最新更新