linux 命令行:如何简单地将任意字符串输入管道?

linux command line: How can simply feed arbitrary strings to pipe?

我正在寻找一个非常简单的技巧:

假设在文件error.txt中,有一个很长的字符串:

{"errorMessage": "....", "key1": "some message...", "key2": "message 2 ...", ....}

因为它的格式不是 reader 友好的,如果我想在终端中以格式良好的形式查看它,我可以这样做:cat error.txt | jq

这将以 reader 友好的形式在终端中打印字符串。

但是,如果我只是复制和粘贴了那么长的字符串,并且我不想经历将其粘贴到 txt 文件中的麻烦,我想立即格式化并查看它。类似于:

cat {"errorMessage": "....", "key1": "some message...", "key2": "message 2 ..."} | jq

其中字符串不是在文件中,而是实时直接粘贴到命令行中?

如何将任意类型的字符串输入管道?

答案是<<<${my_string}语法

jq <<<'{"errorMessage": "....", "key1": "some message...", "key2": "message 2 ..."}'

它可以用来发送任何命令的stdin,不需要多余的echo:ing。我一直在脚本中使用它来解析变量的内容。

简单明了的解决方案是,如果信息可以表示为字符串,您可以通过一种或另一种方式将信息粘贴到标准输入上。

echo "your data here" | cmd
cmd <<<"your data here" # bash only
cmd <<\____EOF  # this is called a "here document"
your data here
____EOF

None 这是管道特有的。

完全任意数据的正确解决方案可能看起来略有不同,因为无法将随机字节表示为字符串。如果字符编码和您的语言环境允许,几乎 每个字节都可以嵌入到字符串中(ISO-8859-1 有这个 属性;UTF-8 没有)但是空字节不能在 shell.

中表示为它们自己

Bash 提供了一种通过使用称为“C 字符串”的扩展来指定几乎任意字符串的方法(在 C 语言中,您可以指定带有反斜杠后跟八进制数的任意字节,以及一系列预定义符号,例如制表符 \t、换行符 \n、铃声字符 \a 等),但这也被限制为 non-null 字节(其中任何空值将被悄悄丢弃!):

echo $'[=11=]0[=11=]0[=11=]0' | wc
       1       0       1

(注意输出如何显示空字节被截断)或者您可以自己执行编码:

echo ___ | tr _ '[=12=]0' | wc
echo AAAACg== | base64 -d | wc
printf '[=12=]0[=12=]0[=12=]0\n' | wc

另请注意,printfecho 更通用,这是很常见的情况。

也许我还应该提到 iconv,因为这是表示无效 UTF-8 字符串的相当常见的用例。

echo möjibäkë | iconv -f utf-8 -t iso8859-1