gpt4 book ai didi

bash - 管道输出不写入标准输出的程序

转载 作者:行者123 更新时间:2023-12-05 01:47:35 24 4
gpt4 key购买 nike

当输入程序不写入标准输出时,我正在寻找使用管道的最佳方式。具体来说,我想像这样将 objcopy 传送到 hexdump

objcopy -I ifmt -O binary ifile - | hexdump -C

但 objcopy 不像某些程序那样接受“-”作为表示“写入标准输出”的文件。

目前我在做

objcopy -I ifmt -O binary ifile tmpfile; hexdump -C tmpfile; rm tmpfile

但想知道是否有更好的方法。

我在 cygwin 上使用 bash 4.1.10。

最佳答案

我写了一条说明流程替换的评论,但它不适用于 objcopy,因为 objcopy 会尝试打开一个可搜索的文件(因为它可能需要移动在文件中来回移动)。

简而言之:objcopy 不能作为stdout 写入流,这就是为什么它的输出必须是一个可以被查找的文件 .您的解决方案很可能是唯一合理的可能性。


回答你的问题

I'm looking for the best way to use pipes when the input program doesn't write to stdout

以更通用的方式(但这不适用于 objcopy 或任何需要查找文件的命令),在 Bash 中,您可以使用进程替换:如果 mycommand 需要作为输出文件的参数,不接受标准输出的 - 并且默认情况下不写入标准输出,您可以将其用作:

mycommand >(cat)

或者如果你想通过管道传递它,例如,hexdump -C:

mycommand >(hexdump -C)

这样,mycommand 将看到 /dev/fd/42 形式的参数(其中 42 可能不同),并且能够打开它进行写入,就好像它是一个常规文件(但不可搜索),hexdump 将在其标准输入上获取写入的数据。

您可以像这样试验进程替换:调用以下脚本 mycommand:

#!/bin/bash

if [[ $1 ]]; then
echo "Hi, this is mycommand, and I was called with first argument: \`$1'"
echo "I'm outputting this to the file given as argument" > "$1"
else
echo >&2 "Please provide an argument (file to write to)"
exit 1
fi

此脚本确保您提供一个非空参数(否则显示错误消息),将此参数输出到标准输出,并在文件中的一小行中给出其名称作为参数。

然后 chmod +x mycommand 并使用它:

$ ./mycommand
Please provide an argument (file to write to)
$ ./mycommand -
Hi, this is mycommand, and I was called with first argument: `-'
$ ls
- mycommand
$ rm ./-
$ ./mycommand >(cat)
Hi, this is mycommand, and I was called with first argument: `/dev/fd/63'
I'm outputting this to the file given as argument
$ ./mycommand >(tr -d e)
Hi, this is mycommand, and I was called with first argument: `/dev/fd/63'
I'm outputting this to th fil givn as argumnt
$ ./mycommand >(hexdump -C)
Hi, this is mycommand, and I was called with first argument: `/dev/fd/63'
00000000 49 27 6d 20 6f 75 74 70 75 74 74 69 6e 67 20 74 |I'm outputting t|
00000010 68 69 73 20 74 6f 20 74 68 65 20 66 69 6c 65 20 |his to the file |
00000020 67 69 76 65 6e 20 61 73 20 61 72 67 75 6d 65 6e |given as argumen|
00000030 74 0a |t.|
00000032
$ ./mycommand >(cat) > /dev/null
I'm outputting this to the file given as argument

关于bash - 管道输出不写入标准输出的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com