shell 内置的 exec 命令用于执行 shell 脚本中的命令。
等待! 不要执行shell脚本 Linux 命令已经? 他们是这样。 但 exec 运行 Linux 命令而不启动新进程. 它用指定的命令替换 shell 进程。
看起来很复杂? 让我举一些在 shell 脚本中使用 exec 命令的例子:
- 工艺置换
- 在 shell 脚本中记录
- 更改标准输入以读取文件
- 更改文件描述符
因此,让我们从第一个开始。
1.使用exec命令替换shell脚本中的进程
替换进程是 shell 脚本中最著名的 exec 实现之一。
所以在这里,我将使用一个简单的脚本来展示如何使用脚本中的 exec 命令来替换当前的 shell 进程。
首先,使用以下命令使用 nano 创建和编辑新脚本:
nano process_replacement.sh
并粘贴以下内容:
#!/bin/bash
echo "Before exec: This is the original script"
exec ls -l
echo "After exec: This line will not be executed"
完成后,保存更改并退出 nano 文本编辑器。
现在,让我解释一下这个脚本将做什么。
下面是三个命令语句。 首先将打印指示要替换的原始脚本的基本文本。
第二个语句涉及使用 exec 命令和 ls 命令来列出当前工作目录的内容,它也会替换之前的过程!
现在,第三条语句将不会执行,因为该进程之前已被 exec 替换,并且没有额外的参数来支持第三条命令语句的执行。
简单地说,进程将被第二个命令参数替换,而第三个命令将不会被执行。
如果执行显示的脚本,这里是输出:
如您所见,此处显示了本应打印“After exec: This line will not be executed”的第三条命令语句。
那个好像不是很实用? 这是另一个 example.
2.在shell脚本中使用exec命令进行日志记录
exec 的另一个有趣且简单的实现是您可以将输出重定向到一个文件。
在这里,我将使用 3 个参数,两个用于标准输出,一个用于标准错误。
这是一个脚本:
#!/bin/bash
LOG_FILE="script.log"
# Redirect stdout and stderr to the log file
exec &> "$LOG_FILE"
# Start logging
echo "Script started at $(date)"
# Perform some operations
echo "Performing operation 1 (stdout)..."
ls -l /path/to/directory
echo "Performing operation 2 (stderr)..."
grep "search term" /path/to/nonexistentfile
echo "Performing operation 3 (stdout)..."
cat /path/to/file
# Log completion
echo "Script completed at $(date)"
我创建了一个名为的空文件 script.log
在上述脚本所在的同一目录中存储日志。
在这里,exec 命令会将输出重定向到日志文件,包括何时开始和结束。
当我运行脚本时,包含日志文件的文件如下所示:
3.改变标准输入使用exec读取文件
这在对文件执行某些操作时非常有用。
在这里,我将使用一个名为 Hello.txt
包含一些随机文本行:
Ubuntu, openSUSE, Arch, Debian, Fedora
+ - / *
2 4 6 1
4 6 1 2
这是将从文件中读取并将内容输出到标准输出的脚本:
#!/bin/bash
INPUT_FILE="Hello.txt"
# Redirect stdin to read from a file
exec < "$INPUT_FILE"
# Read the entire file as a single input
content=$(cat)
# Process the input
echo "Read: $content"
现在,让我解释一下脚本。
INPUT_FILE
指定要读取的文件。exec < "$INPUT_FILE"
是从指定文件读取的重定向content=$(cat)
将读取整个文本文件并将其分配给content
多变的。echo "Read: $content"
将打印的值content
多变的。
如果执行脚本,结果将如下所示:

4. 在 shell 脚本中使用 exec 更改文件描述符(高级)
一共有三个标准的文件描述符 Linux:
- 标准输入(stdin – 文件描述符 0)
- 标准输出(stdout – 文件描述符 1)
- 标准错误(stderr – 文件描述符 2)
使用 exec 命令,您可以更改描述符。 为了 example,您可以使用任何数字来使用首选数据流,例如将 3 用于 stdin。
让我先分享脚本,然后解释它是如何工作的:
#!/bin/bash
# Open a file for writing
exec 3> output.txt
# Redirect stdout to file descriptor 3
exec 1>&3
# Print some output
echo "This is a test message"
# Close the file descriptor
exec 3>&-
在这里,我打开了一个 output.txt
file 和分配的文件描述符 3 这意味着发送到文件描述符 3 的任何内容都将写入文件。
使用 exec 1>&3
,我已将标准输出 (1) 重定向到文件描述符 3,这意味着写入标准输出的任何内容都将发送到文件描述符 3(在我的示例中为 output.txt)。
echo 语句将文本打印到标准输出(当我们之前更改文件描述符时,它将被发送到文件)。
和 exec 3>&-
杀死文件描述符 3,因为它不再需要了!
执行上述脚本后,您可以预期得到如下结果:

通过将 exec 与 find 命令配对来执行更多操作
您知道吗,您可以将 find 命令与 exec 结合使用,相信我,这是一个绝妙的组合?
如果你想学习如何,这里有一份详细的指南:
我希望您会发现本指南对您有所帮助。 如果您有疑问,请发表评论。