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 / 问题 / 513516
Accepted
Harold Fischer
Harold Fischer
Asked: 2019-04-20 22:17:57 +0800 CST2019-04-20 22:17:57 +0800 CST 2019-04-20 22:17:57 +0800 CST

破折号:当我的脚本甚至不包含反引号时,为什么我会收到错误“语法错误:反引号替换中的 EOF”?

  • 772
#!/bin/sh --

for set_trap_sig in HUP INT QUIT ALRM TERM; do
    trap -- '
        trap -- - '"${set_trap_sig:?}"' EXIT || exit "$?"
        kill -s '"${set_trap_sig:?}"' -- "$$" || exit "$?"' "$set_trap_sig"
done

sleep 15 || exit "$?"

这是我向脚本发送 SIGINT 时发生的情况

user@hostname:/tmp$ ./script.sh
^C./script.sh: 3: ./script.sh: Syntax error: EOF in backquote substitution

这个问题似乎是 dash 特有的。在 ash、bash 和 ksh93 上,我没有收到此错误。这特别奇怪,因为我的脚本甚至不包含反引号字符。

如果我删除第 5 行尾随的双引号,$?错误就会消失。

我是在做一些愚蠢的事情还是冲刺被削弱了?是的,我知道我写的剧本就像一个偏执的精神分裂症患者。

编辑:我们已经确定这是一个非常严重的错误,它甚至会影响现代版本的 Ubuntu 和 Debian。有谁知道解决方法?

shell quoting
  • 1 1 个回答
  • 5506 Views

1 个回答

  • Voted
  1. Best Answer
    mosvy
    2019-04-21T07:45:34+08:002019-04-21T07:45:34+08:00

    这是一个简化的测试用例:

    trap '
            trap    - HUP EXIT || exit "$?"
            kill -s HUP    "$$" || exit "$?" ' HUP INT
    kill -HUP $$
    
    $ dash dash-bug
    dash-bug: 3: /home2/ahq/dash-bug: Syntax error: EOF in backquote substitution
    

    修改引用代码的长度或内容可能会“修复”错误或产生不同且有趣的损坏,随机字节突然出现。

    这是由 dash 0.5.9 之后修复的 use-after-free 错误引起的,但它仍然存在于 Debian 9.8 stable(stretch)、Ubuntu 18.04(bionic)和 Ubuntu 18.10(cosmic)的 dash 0.5.8 中.

    这是修复它的提交:

    commit 6c3f73bc536082fec38bd36e6c8a121033c68835
    Author: Herbert Xu <[email protected]>
    Date:   Thu Oct 2 08:26:06 2014 +0800
    
        [EVAL] Fix use-after-free in dotrap/evalstring
    
        The function dotrap calls evalstring using the stored trap string.
        If evalstring then unsets that exact trap string then we will end
        up using freed memory.
    
        This patch fixes it by making evalstring always duplicate the string
        before using it.
    
        Signed-off-by: Herbert Xu <[email protected]>
    

    一种解决方法是将陷阱处理程序放在一个函数中——以便在取消设置陷阱后不会运行任何命令尝试在释放它之后使用操作字符串:

    sighandler(){
        trap - "$sig" EXIT || exit "$?"
        kill -s "$sig" "$$" || exit "$?"
    }
    for sig in HUP INT QUIT ALRM TERM; do
        trap "sig=$sig; sighandler" "$sig"
    done
    
    kill -s HUP "$$"
    
    • 3

相关问题

  • FreeBSD 的 sh:列出函数

  • U-Boot 参数的简写语法

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

  • grep -v grep 有什么作用

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

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +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