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 / 问题 / 408124
Accepted
nponeccop
nponeccop
Asked: 2017-12-01 22:21:56 +0800 CST2017-12-01 22:21:56 +0800 CST 2017-12-01 22:21:56 +0800 CST

在 MacOs 上迭代地写入同一个进程替换文件

  • 772

以下 bash-fu 代码在 Linux 上运行良好,但在 MacOS 上中断:

files="foo bar"

echo PROG 1
for file in $files
do
  echo $file | tee -a tempfile.txt
done

sort -u tempfile.txt

echo PROG 2
function trick {
  for file in $files
  do
    echo $file | tee -a $1
  done
}

trick >(sort -u)

错误是:

PROG 1
foo
bar
bar
foo
PROG 2
tee: /dev/fd/63: Bad file descriptor
foo
tee: /dev/fd/63: Bad file descriptor
bar

在 Linux 上写入与没有错误PROG 2相同的行。PROG 1在 MacOS 上,管道句柄似乎已关闭或未继承。

以上是重现问题的最小化样本。实际上,我会大量处理绑定输出和重定向句柄。精神上的东西

function trick {
  for file in $files
  do
     echo $file | tee -a $1 | grep -Eo "^.."
  done
}

trick >(sort -u | sed 's|o|x|g')

该代码在 Bash 4.1 中不起作用,但在多个发行版(Arch、Ubuntu 和 Debian)中的 Bash 4.4 中起作用

bash process-substitution
  • 1 1 个回答
  • 449 Views

1 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-02T02:43:22+08:002017-12-02T02:43:22+08:00

    macOS 带有一个非常旧版本的bash. 该错误(该进程替换的文件描述符tee在该上下文中调用之前已关闭)¹已在较新版本中修复。您会在 Linux 上遇到/dev/fd/x与 bash 3.2 相同的问题(在不同的地方实现不同的错误消息)。

    在这里,您可以使用zshorksh93代替。bash无论如何避免在这里是个好主意,因为它不会等待进程替换中的进程(zsh 等待它们,可以告诉 ksh93wait为它们)。

    请注意,即使使用最新版本(撰写时为 4.4.12),bash这里仍然存在一些错误,例如:

    $ bash -c 'eval cat <(echo test)'
    test # OK but:
    $ bash -c 'eval "echo foo;cat" <(echo test)'
    foo
    cat: /dev/fd/63: No such file or directory
    $ bash -c 'eval f=<(echo test) "; cat \$f"'
    cat: /dev/fd/63: No such file or directory
    

    有些仍然由管道触发,例如:

    $ cat file
    echo "$1"
    cat "$1"
    $ bash -c 'source ./file <(echo test)'
    /dev/fd/63
    test  # OK but:
    $ cat file2
    echo "$1" | wc -c
    cat "$1"
    $ bash -c 'source ./file2 <(echo test)'
    11
    cat: /dev/fd/63: No such file or directory
    

    ¹ 一旦有管道,bash 就会关闭该文件描述符。更短的复制器:

    $ bash -c 'f() { :; cat "$1"; }; f <(echo OK)'
    OK
    $ bash -c 'f() { :|:; cat "$1"; }; f <(echo test)'
    cat: /dev/fd/63: No such file or directory
    
    • 2

相关问题

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

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

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

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

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

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