我想将 shell 变量的内容原封不动地写入管道。“echo -n”也很好。
每个人都说“使用 printf”,类似
echo() {
case "$1" in
-n) shift; printf '%s' "$*" ;;
*) printf '%s\n' "$*" ;;
esac
}
但由于 printf 是外部命令,因此它可以作为参数的字符数是有限的,通常为 131072 或 65536,也可能更少,具体取决于操作系统。我正在处理 json 问题列表,长度可能高达数百 K,并且它必须在任何地方都能正常工作。
您不能使用“echo -e”,因为 dash 的内置 echo 总是映射反斜杠序列。
在基本 shell 中必须有一种方法,无需使用外部程序,即可将变量的内容写入管道或文件。
没有嗎?
这将在末尾添加一个换行符,这对于 json 数据来说是没问题的,而且从命令替换加载的任何内容都会删除尾随的换行符;为了避免添加它(回来),你可以
在确保末尾有换行符之前,先将其删除。shell 本身只处理文本;在可移植文本文件中,行以换行符结尾。
顺便问一下,在哪种 shell 中 printf 不是内置函数?我试了一下
read -d '' </usr/include/vulkan/vulkan_structs.hpp; printf %s "$REPLY" | wc -c; echo ${#REPLY}
,结果得到 5539603 5539603,内置函数没有参数长度限制。应该有,但我认为你只是发现了 POSIX 中的一个问题。
简单的解决方法是创建
printf
一个内置 shell。与此同时,
xargs
去救援。local
从几个版本之前就已包含在 POSIX 中,尽管据我所知,仍然有一些 shell 不支持它。尽管如果你
echo
处理反斜杠序列,它就会一直向下移动。