13

我经常难以弄清楚某些语言结构,因为在谷歌搜索或鸭鸭搜索时它们不会注册。通过一些实验,通常很容易弄清楚,但我没有得到这个。

我经常看到类似bash 脚本2>&13>&-在 bash 脚本中的东西。我知道这是某种重定向。1 是标准输出,2 是标准错误。3可能是习惯。但是减号是什么?

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

4

2 回答 2

11
  1. 2>&1表示stderr被重定向到stdout
  2. 3>&-表示为写入而打开的文件描述符 3(与标准输出相同)已关闭。

您可以在此处查看更多重定向示例

  1. 至于问题3,我认为是一个很好的链接。
于 2012-12-28T09:15:00.777 回答
4

关闭33>&-号文件描述符(它可能之前已经用 打开过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 中有一种方法可以得到它,但我现在不记得了。

于 2012-12-28T09:16:32.347 回答