AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 407095
Accepted
humanityANDpeace
humanityANDpeace
Asked: 2017-11-27 02:11:16 +0800 CST2017-11-27 02:11:16 +0800 CST 2017-11-27 02:11:16 +0800 CST

在 bash 中运行“exec echo some; echo test”是否永远不会打印“some test”?

  • 772

在 bash中运行exec echo "some "; echo "test"从不打印“一些测试”吗?

我会寻求对这个问题的确认,因为我正在编写一个小的 shell 脚本,并且我希望它在exec调用命令后不会继续任何事情。

根据我的理解,我认为在咨询后无需担心:

  • man 3 exec
  • man 1p exec

shell 脚本,当由 shell 执行时,将

  1. shell执行程序exec,它
  2. 使用exec***家族系统调用来替换执行脚本的 shell/bash,从而阻止shell 的进一步操作(被“替换”)

如前所述,这个问题的主要目标是寻求对我的推理的确认,以防止脚本中在 exec 之后发生的任何事情(例如echo test)将被执行。

我会尽可能地欣赏一个一般性的答案(POSIX),但就特殊情况而言,我对 GNU/Linux 和 GNU/Bash 最感兴趣

shell exec
  • 3 3 个回答
  • 7202 Views

3 个回答

  • Voted
  1. ilkkachu
    2017-11-27T04:22:14+08:002017-11-27T04:22:14+08:00

    对了,如果exec成功,就替换当前的shell,所以下面的命令没有,err..执行。

    但是,至少在 Bash 中,如果exec 失败,shell 也会退出:

    exec [-cl] [-a name] [command [arguments]]

    如果提供了command,它会替换 shell 而不会创建新进程。[...] 如果由于某种原因无法执行命令execfail,则会退出非交互式 shell,除非启用了 shell 选项。在这种情况下,它返回失败。

    因此,即使是类似的东西bash -c 'exec /bin/nosuchfile; echo foo'也只会打印有关丢失的程序文件的错误消息。要处理脚本中的错误,您需要类似

    #!/bin/bash
    shopt -s execfail
    exec /someprogram
    echo whoops, it failed
    

    但是,您仍然会从exec. 如果您在 上放置重定向,如果脚本在失败后继续exec,它仍然有效。exec

    • 7
  2. Gilles 'SO- stop being evil'
    2017-11-27T04:18:20+08:002017-11-27T04:18:20+08:00

    内置(exec带有命令参数¹)替换了 shell 进程²。不执行 shell 进程中的后续代码。

    exec echo "some "; echo "test"因此,打印的唯一方法some text是如果echo在 PATH 中调用了一个可执行命令,并且打印的是这个可执行文件some text而不是some. 在正常情况下,echo可执行文件的行为与人们对名为echo.

    如果echoPATH 中没有调用可执行文件或执行失败,exec则会显示错误消息并退出 shell。即使在那种情况下,echo "test"也不执行。

    ¹没有命令参数是另一种野兽。它不会取代 shell 进程,它只是应用重定向。 ²在子shell中,只有子shell受到影响,父shell保持正常运行。 exec

    • 5
  3. Best Answer
    Hauke Laging
    2017-11-27T04:05:58+08:002017-11-27T04:05:58+08:00

    exec如果它执行命令并且成功地完成了脚本,它总是会完成脚本(与命令的退出代码无关,但与启动它无关)。

    exec可以在没有命令的情况下以非常有用的方式运行:永久重定向文件描述符:

    exec 3>/path/to/file
    

    如果无法启动命令,则 shell 行为取决于配置。bash默认退出。

    您最好改用函数:

    safe_exec () {
        cmd="$1"
        if test -z "$cmd" || ! test -f "$cmd" || ! test -x "$cmd"; then
            exit 1
        else
            exec "$@"
        fi
    }
    
    safe_exec echo "some "; echo "test"
    
    • 3

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve