“exec 3>& - ”中的减号含义是什么?我如何使用它?

时间:2012-12-28 08:57:13

标签: bash redirect terminal stdout sh

我经常无法弄清楚某些语言结构,因为他们在google搜索或传播它们时不会注册。通过一些实验,通常很容易弄清楚,但我不会得到这个。

我经常在bash脚本中看到2>&13>&-之类的内容。我知道这是某种重定向。 1是stdout,2是stderror。 3可能是定制的。但是减号是什么?

另外,我有一个脚本,其输出我想记录,但也想在屏幕上看到。我使用exec > >(tee $LOGFILE); exec 2>&1。有用。但有时当我对这个脚本进行bashtrap时,我不能再输入提示了。输出在Ctrl+C后隐藏。我可以使用自定义渠道和减号来解决此问题,还是不相关?

2 个答案:

答案 0 :(得分:6)

  1. 2>&1表示stderr被重定向到stdout
  2. 3>&-表示已打开文件描述符3(与stdout相同)已关闭。
  3. 您可以看到更多重定向here

    的示例
    1. 至于问题3,我认为this是一个很好的链接。

答案 1 :(得分:4)

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有一种方法可以实现,但我现在不记得了。