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
    • 最新
    • 标签
主页 / computer / 问题 / 1470243
Accepted
Hashbrown
Hashbrown
Asked: 2019-08-12 20:35:09 +0800 CST2019-08-12 20:35:09 +0800 CST 2019-08-12 20:35:09 +0800 CST

为什么管道对于需要 stdin 的命令不起作用?

  • 772

所以,我希望将 的输出unzip -Z1放入数组中并找到了这个答案;他们的第一个选择,使用mapfile输入重定向并处理替换,很有魅力。

但后来我想,“等等,进程替换”,它从标准输出创建一个文件描述符,“然后使用输入重定向将内容放入标准输入?”
这不等同于管道吗?

显然没有。不,不是。在这里,我尝试将 的内容ls放入变量中,但使用的是管道:à la ls | mapfile -t test
在此处输入图像描述 Nada。

但是,如果我按照 T 的答案:id est mapfile -t test < <(ls)
在此处输入图像描述 Voilà。

但是为什么? diff无法区分。至少他们之间的内容。
在此处输入图像描述

除了创建文件描述符外,我找不到任何内在的特殊之处。< <()以此为理论,我尝试了 HEREDOC,它也制作了一个文件描述符。有效:

mapfile -t test2 << END && printf '%s ' "${test2[@]}"
this
is
an
array
END

但如果它是通过stdinvia清洗的cat,请尝试:

cat << END | mapfile -t test3 && printf '%s ' "${test3[@]}"
this
is
an
array
END

所以,我的问题。
HEREDOC 发现/文件描述符理论应该无关紧要,mapfile因为它的手册都说它使用“标准输入”,对吗?
如果“标准输入”以某种方式意味着它必须是一个更高级的描述符;为什么?为什么不能使用简单的一次读取输入流来生成数组?
最后,如果这两个都得到了回答/在正确的轨道上,为什么命令在预期 fd 时没有失败?你会看到我的终端0打印了一堆(我们用&&在最后一个例子中),那是$?在我的上prompt,所以内置没有报告错误。

我在 Fedora 30 和 RHEL 6 上试过这个,所以我不认为这是一个错误。

bash stdin
  • 1 1 个回答
  • 836 Views

1 个回答

  • Voted
  1. Best Answer
    user1686
    2019-08-12T21:07:19+08:002019-08-12T21:07:19+08:00

    有用; 只是结果立即消失了。

    不同之处在于,这foo | mapfile是一个由两个新进程组成的管道——每个元素,无论是外部程序还是内置 shell,都在子 shell 中运行。因此,尽管 mapfile 仍在执行其工作,但它无法将结果传输到父 shell 进程。

    为了进行比较,使用(mapfile < foo.txt)orls | while read line; do ... done或 even会得到相同的结果(foo=bar); echo $foo。在所有这些情况下,如果比较 $BASHPID 和 $$,您会看到不同的值——前者显示子 shell 进程 PID 与主 shell PID 不同。

    使用重定向时,该mapfile命令在主 shell 进程中运行,并且可以正确更改 shell 变量。它不太关心它是从真实文件、生成的<<临时文件还是生成的<()魔术文件进行重定向——在这种情况下,shell 将其作为一个单独的步骤处理,不会导致管道待建。<()(当然, or的内部命令$() 是一个子 shell。)


    请注意,该变量实际上可以在子 shell 中使用——只是不能向上传输。因此,对于一次性操作,管道的第二部分可能会非常复杂:

    unzip -l | {
        mapfile -t test
        for file in "${test[@]}"; do
            echo "I got $file!"
        done
    }
    
    zipinfo | while read -r file; do
        echo "I got $file!"
    done
    
    • 2

相关问题

  • 在非 root 用户上用 bash 替换 zsh

  • 在 macOS High Sierra 的终端中设置环境变量时遇到问题

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • Notify-发送窗口下出现的通知

  • 如何从 WSL 打开 office 文件

Sidebar

Stats

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

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve