Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash “中的负是什么意思?”;执行官3>&-&引用;我如何使用它?_Bash_Redirect_Terminal_Stdout_Sh - Fatal编程技术网

Bash “中的负是什么意思?”;执行官3>&-&引用;我如何使用它?

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之后隐藏

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

我经常在bash脚本中看到像
2>&1
3>&-
这样的东西。我知道这是某种重定向。1为标准输出,2为标准输出。3可能是习惯。但缺点是什么

另外,我有一个脚本,我想记录它的输出,但也希望在屏幕上看到它。我使用
exec>>(tee$LOGFILE);执行2>&1
。它起作用了。但有时当我使用bashtrap编写这个脚本时,我就不能再在提示符下键入了。输出在
Ctrl+C
之后隐藏。我可以使用自定义频道和减号来修复此问题,还是与此无关

  • 2>&1
    表示stderr被重定向到stdout
  • 3>&-
    表示为写入而打开的文件描述符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中有一种方法可以得到它,但我现在记不起来了。

    您得到了两个准确的答案。该文件还涵盖了这些符号的使用,并解释了为什么海贝应该留在海边,而不是用于编写脚本。