我经常无法弄清楚某些语言结构,因为他们在google搜索或传播它们时不会注册。通过一些实验,通常很容易弄清楚,但我不会得到这个。
我经常在bash脚本中看到2>&1
或3>&-
之类的内容。我知道这是某种重定向。 1是stdout,2是stderror。 3可能是定制的。但是减号是什么?
另外,我有一个脚本,其输出我想记录,但也想在屏幕上看到。我使用exec > >(tee $LOGFILE); exec 2>&1
。有用。但有时当我对这个脚本进行bashtrap时,我不能再输入提示了。输出在Ctrl+C
后隐藏。我可以使用自定义渠道和减号来解决此问题,还是不相关?
答案 0 :(得分:6)
答案 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有一种方法可以实现,但我现在不记得了。