gdb /bin/cat ... -6ren">
gpt4 book ai didi

bash - 为什么 '<<<' 会过滤 gdb 中的空字节,而 '<()' 不会?

转载 作者:行者123 更新时间:2023-11-29 09:10:54 24 4
gpt4 key购买 nike

我最近发现 <<<把戏 gdbstdin被调试程序的一部分正在从流中过滤掉空字节。

这是一个小例子(任何人都应该能够在家里重现)来证明它过滤掉了空字节:

$> python -c 'print("A\x00" * 10)' | cat -A
A^@A^@A^@A^@A^@A^@A^@A^@A^@A^@$
$> gdb /bin/cat

... gdb license prelude ... snip...

(gdb) r -A <<< $(python -c 'print("A\x00" * 10)')
Starting program: /bin/cat -A <<< $(python -c 'print("A\x00" * 10)')
/bin/bash: warning: command substitution: ignored null byte in input
AAAAAAAAAA$
[Inferior 1 (process 3798) exited normally]

其中,使用特定于 bash 的 <() process substitution留下空字节到达程序 stdingdb 内:

(gdb) r -A < <(python -c 'print("A\x00" * 10)')
Starting program: /bin/cat -A < <(python -c 'print("A\x00" * 10)')
A^@A^@A^@A^@A^@A^@A^@A^@A^@A^@$
[Inferior 1 (process 3804) exited normally]

所以,我一直认为<<<<()正在做同样的事情,但现在显然是错误的。我想知道这两种方法有什么区别,并对 bash 有一个解释。神秘的错误信息指出:

/bin/bash: warning: command substitution: ignored null byte in input

我们非常欢迎任何帮助!

最佳答案

So, I always though that <<< and <() were doing about the same thing which is now obviously wrong.

那些根本不做同样的事情。 <<< operator redirects 一个“here string”到关联进程的标准输入。通过 <() 进行进程替换扩展为可以从中读取给定命令的标准输出的文件(通常是 FIFO 或类似文件)的名称。

您的意思似乎是 <<< 的组合使用命令替换(通过 $() 或反引号)与通过 < 的普通标准输入重定向组合做的事情大致相同与过程替代。 这是是真的,但正如您所发现的,语义并不完全等同。

I would like to know what are the differences between the two methods and have an explanation about the bash mysterious error message

主要区别在于,从此处字符串重定向需要首先生成字符串作为 shell 持有的值(您正在通过命令替换执行此操作),而重定向进程替换涉及读取重定向输出 直接由相关进程。

最终,您收到的诊断表明您遇到的意外行为是由命令替换的行为引起的,而不是 <<< 的行为。 .虽然我没有找到它的明确记录,但我一点也不惊讶 Bash 在处理命令替换时从程序输出中去除空字符,因为我希望它的 shell 字符串的内部表示是 C 字符串。 C 字符串以空字符结尾,因此不能表示包含空字符的字符序列。

更新:

另请注意,正如@sorontar 在对其他答案的评论中观察到的那样,POSIX 表示如果命令替换中命令的输出包含空字节,则结果未指定。因此,Bash 可以自由地去除空字节——或者实际上在看到它们时或多或少地做任何它想做的事情——而不会牺牲 POSIX 一致性。在这方面,其他 shell 可能会做出与 Bash 不同的选择。这是避免命令替换的一个很好的理由,因为空字节出现在命令输出中是可预见的可能性。

关于bash - 为什么 '<<<' 会过滤 gdb 中的空字节,而 '<()' 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42954927/

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