我不明白bash exec

时间:2015-11-26 02:52:29

标签: bash exec

#!/bin/bash
#...
exec >> logfile
#cmd

我邀请它保存输出。 你能用同样的例子扩展它吗? 非常感谢你!

我经常使用此命令列出txt文件:

find / -type f -exec grep -l "bash" {} \;

但我也不太了解。

世界上怎么会有这么好的人。非常感动!

3 个答案:

答案 0 :(得分:3)

是的,它会将任何进一步的输出发送到名为logfile的文件。换句话说,它将标准输出(也称为 stdout )重定向到文件logfile

实施例

让我们从这个脚本开始:

$ cat >script.sh
#!/bin/bash
echo First
exec >>logfile
echo Second

如果我们运行脚本,我们会看到第一个而不是第二个echo语句的输出:

$ bash script.sh
First

第二个echo语句的输出转到文件logfile

$ cat logfile
Second
$ 

如果我们使用了exec >logfile,那么每次运行脚本时logfile都会被覆盖。但是,我们使用>>而不是>,输出将追加logfile。例如,如果我们再次运行它:

$ bash script.sh
First
$ cat logfile
Second
Second

文档

man bash中记录了这一点:

  

exec [-cl] [-a name] [command [arguments]]
如果命令   如果指定,它将替换shell。没有创建新进程。该   参数成为命令的参数。如果-l选项是   如果提供,外壳会在第0个开头放置一个破折号   参数传递给命令。这是login(1)的作用。 -c   选项导致命令在空环境中执行。如果   -a被提供,shell将name作为第0个参数传递给执行的命令。如果由于某种原因无法执行命令,a   非交互式shell退出,除非execfail shell选项是   启用。在这种情况下,它返回失败。交互式shell   如果无法执行文件,则返回失败。 如果命令不是   指定,任何重定向在当前shell中生效,并且   返回状态为0. 如果存在重定向错误,则返回   状态是1. [强调补充。]

在您的情况下,未指定命令参数。因此,exec命令执行重定向,在这种情况下,意味着将任何进一步的标准输出发送到文件logfile

find命令和-exec

find命令有-exec选项。例如:

find / -type f -exec grep -l "bash" {} \;

除了名称相似之外,这里的-exec与shell命令exec完全无关。

构造-exec grep -l "bash" {} \;告诉find 在找到的任何文件上执行命令grep -l "bash"。这与shell命令exec >>logfile无关,它只执行任何操作,但具有重定向输出的效果。

答案 1 :(得分:1)

您输出到stdout的所有内容都不会转到stdout而是转到日志文件。 见下面的例子:

#!/bin/bash
# reassign-stdout.sh

LOGFILE=logfile.txt

exec 6>&1           # Link file descriptor #6 with stdout.
                    # Saves stdout.

exec > $LOGFILE     # stdout replaced with file "logfile.txt".

# ----------------------------------------------------------- #
# All output from commands in this block sent to file $LOGFILE.

echo -n "Logfile: "
date
echo "-------------------------------------"
echo

echo "Output of \"ls -al\" command"
echo
ls -al
echo; echo
echo "Output of \"df\" command"
echo
df

# ----------------------------------------------------------- #

exec 1>&6 6>&-      # Restore stdout and close file descriptor #6.

echo
echo "== stdout now restored to default == "
echo
ls -al
echo

exit 0

答案 2 :(得分:0)

这会将您的脚本生成的标准输出以及随后调用的任何其他程序重定向到logfile。因此,如果您的脚本在执行后在终端中运行

exec >> logfile

你会在终端窗口看到没有输出,但你会在logfile内找到它。如果logfile在每次运行脚本时都不存在或附加,则会创建pthread_cond_timedwait()