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 / 问题 / 503682
Accepted
illiterate
illiterate
Asked: 2019-03-01 20:38:49 +0800 CST2019-03-01 20:38:49 +0800 CST 2019-03-01 20:38:49 +0800 CST

如何在此处文档中转义空字符?(bash 和/或破折号)

  • 772

我想shuf --zero-terminated用 here-document 处理多行字符串。

bash dash
  • 3 3 个回答
  • 1077 Views

3 个回答

  • Voted
  1. Best Answer
    Michael Homer
    2019-03-01T22:29:37+08:002019-03-01T22:29:37+08:00

    Bash 和 dash 中的 Here-documents 不支持这一点。您不能将 null 存储在变量中,它们会从命令替换中删除,您不能按字面意思写一个,也不能在 here-document 中使用 ANSI-C 引用。这两个 shell 都不是空友好的,如果确实进入,它们通常被视为(C 样式)字符串终止符。

    您有几个选择:使用真实文件、使用 zsh、使用进程替换或使用标准输入。


    你可以在 zsh 中做你想做的事,这对 null 更友好。

    zsh% null=$(printf '\x00')
    zsh% hexdump -C <<EOT
    heredoc> a${null}b${null}
    heredoc> EOT
    00000000  61 00 62 00 0a                                    |a.b..|
    00000005
    

    请注意,尽管 heredocs 有一个隐式终止换行符,这可能是不可取的(它将是shuf最终 null 之后的额外字段)。


    对于 Bash,您可以使用几乎等同于您的 heredoc 的进程替换printf与内联或echo -e创建空值:

    bash$ hexdump -C < <(
    printf 'item 1\x00item\n2\x00'
    )
    00000000  69 74 65 6d 20 31 00 69  74 65 6d 0a 32 00        |item 1.item.2.|
    0000000e
    

    这不一定完全等同于 here-document,因为它们通常由 shell 秘密地放入真实文件中(这对于可查找性等很重要)。

    由于您可能想要禁止终止换行符,因此您甚至不能在内部的命令中使用heredoc - 它必须printf/echo -ne如果安全才能对输出进行细粒度控制。


    您不能在破折号中进行进程替换,但在任何 shell 中,您都可以从子 shell 中输入标准输入:

    dash$ (
    printf 'item 1\x00'
    printf 'item\n2\x00'
    ) | hexdump -C
    00000000  69 74 65 6d 20 31 00 69  74 65 6d 0a 32 00        |item 1.item.2.|
    0000000e
    

    shuf默认情况下很高兴从标准输入中读取,因此据我了解,这应该适用于您的具体用例。如果您有一个更复杂的命令,则位于管道的右侧可能会引入一些与范围界定混淆的元素。


    printf最后,您可以使用并使用它而不是 here-document将数据写入真实文件。该选项已包含在另一个答案中。您需要确保之后清理文件,并且mktemp如果有任何实时安全问题,可能需要使用或类似的工具来创建安全的文件名。

    • 9
  2. illiterate
    2019-03-02T00:14:12+08:002019-03-02T00:14:12+08:00

    谢谢你们。让我根据你们所有人发布一个答案,也许对我最好。

    该脚本在 bash 和 dash 中运行良好,不需要在 bash 中进行真正的文件或进程替换,不需要额外缓慢的外部程序调用,即使您不需要担心实体中%s的任何转义问题,如C printf,但您应该仍然注意在您的外壳本身中进行字符串转义。

    #!/bin/sh
    printf '%s\0' "[tag1]
    key1=value1
    key2=value2
    [/tag1]
    " "[tag2]
    key3=value3
    key4=value4
    [/tag2]
    " | shuf --zero-terminated
    #also see man printf(1)
    

    仅用于shuf(不打算使用一般的此处文档替代方案):

    shuf --echo "[tag1]
    key1=value1
    key2=value2
    [/tag1]" "[tag2]
    key3=value3
    key4=value4
    [/tag2]"
    
    • 6
  3. fpmurphy
    2019-03-01T21:18:51+08:002019-03-01T21:18:51+08:00

    我不认为你可以在heredoc中做你想做的事。但是,使用echo如下示例所示是微不足道的:

    $ cat demo
    #!/bin/bash
    
    echo -ne "one\0" > outfile
    echo -ne "two\0" >> outfile
    echo -ne "three\0" >> outfile
    
    $ ./demo
    $ od -a outfile
    0000000   o   n   e nul   t   w   o nul   t   h   r   e   e nul
    0000016
    $ 
    
    • 3

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

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