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 / 问题 / 449111
Accepted
Harry
Harry
Asked: 2018-06-12 05:49:35 +0800 CST2018-06-12 05:49:35 +0800 CST 2018-06-12 05:49:35 +0800 CST

bash:从fifo读取完整记录

  • 772

我希望通过 FIFO 从进程 B 向进程 A 发送命令。

该命令将是一个单词或一个句子,但完全包含在“\n”终止的行上 - 但通常可以是多行记录,由另一个字符终止。

我尝试过的代码的相关部分如下所示:

过程一:

$ mkfifo ff
$ read x < ff

进程 B:( 从另一个终端窗口)

$ echo -n "cmd"   > ff
$ echo -n " arg1" > ff
$ echo -n " arg2" > ff
 ...    
$ echo    " argN" > ff

但是,发生的情况是,read返回值为cmd,即使bash手册页说,默认情况下,读取\n终止的行,除非-d delim使用该选项。

所以,我接下来尝试-d delim明确指定,

$ read -d "\n" x < f`

还是一样的结果。

可以echo -n关闭 FIFO 的文件“描述符”吗?

我在 Ubuntu 18.04 上使用 bash 4.4.x。

bash read
  • 1 1 个回答
  • 2614 Views

1 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2018-06-12T06:07:58+08:002018-06-12T06:07:58+08:00

    是的,这正是发生的事情:

    $ mkfifo p
    $ while :; do cat p ; done > /dev/null  & 
    $ strace -etrace=open,close bash -c 'echo -n foo > p; echo bar > p' |& grep '"p"' -A1
    open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
    close(3)                                = 0
    --
    open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
    close(3)                                = 0
    

    重定向仅在它们设置的单个命令的持续时间内生效。写入端的解决方法是 a) 使用复合块对命令进行分组,或 b)exec用于在整个脚本期间(或直到关闭)打开文件描述符。

    一个)

    { echo -n foo; echo bar; } > p
    

    (您也可以将命令放在函数中,并在调用函数时使用重定向。)

    b)

    exec 3>p
    echo -n foo >&3
    echo bar    >&3
    exec 3>&-         # to explicitly close it
    

    如果你想在阅读端修复它,你需要循环read并连接你得到的字符串。由于您明确需要部分非行,并跳过文件结束条件,因此您不能将退出代码read用于任何有用的事情。

    • 4

相关问题

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

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

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

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

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

Sidebar

Stats

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

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

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • 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
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +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