根据以下示例,以及我最近的问题 在 bash 中,尾随的换行符去哪儿了?,我想知道它“为什么”发生
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p
# Output is: 610a62
# The trailing newline from the 'echo' command
# has been "deleted" by Command Substitution
Run Code Online (Sandbox Code Playgroud)
我认为shell 操作必须有一些非常重要的原因,即命令替换,从它正在替换的命令输出中实际删除一些数据......
但我无法理解这个,因为它似乎是它应该做什么的对立面......即。将命令的输出传递回脚本进程......保留一个字符对我来说似乎很奇怪,但我认为有一个合理的原因......我很想知道这个原因是什么...... .
file.txt 的内容(不奇怪,POSIX 定义的文本文件)
iguana
gecko
anole
Run Code Online (Sandbox Code Playgroud)
示例脚本:
#!/bin/sh
string="$(cat file.txt)"
printf '%s' "$string"
Run Code Online (Sandbox Code Playgroud)
示例输出:
[coolguy@somemachine ~]$ ./script.sh
iguana
gecko
anole[coolguy@somemachine ~]$
Run Code Online (Sandbox Code Playgroud)
最后一个换行符发生了什么?为什么除了最后一个都保留了换行符?如果已经有一个换行符,我们似乎不必使用 echo 添加一个换行符。
我正在自定义我的 zshPROMPT
并调用一个函数,该函数可能是也可能不是echo
基于环境变量状态的字符串:
function my_info {
[[ -n "$ENV_VAR"]] && echo "Some useful information\n"
}
local my_info='$(my_info)'
PROMPT="${my_info}My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
我希望信息以尾随换行符结尾,这样如果设置了它,它就会出现在自己的行上:
Some useful information
My awesome prompt $>
Run Code Online (Sandbox Code Playgroud)
但是,如果未设置,我希望提示在一行上,避免提示中由无条件换行引起的空行:
PROMPT="${my_info} # <= Don't want that :)
My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
目前,我$(command substitution)
通过使用非打印字符作为后缀来解决删除换行符的问题,因此换行符不再尾随:
[[ -n "$ENV_VAR"]] && echo "Some useful information\n\r"
Run Code Online (Sandbox Code Playgroud)
这显然是一个黑客。有没有一种干净的方法来返回以换行符结尾的字符串?
编辑:我明白是什么导致了尾随换行符丢失以及为什么会发生这种情况,但在这个问题中,我特别想知道如何防止这种行为(我认为这种解决方法不适用于我的情况,因为我是寻找“条件”换行符)。
编辑:我更正了:引用的解决方法实际上可能是一个相当不错的解决方案(因为比较中的前缀字符串是一种常见且有些相似的模式),但我无法使其正常工作:
echo "Some useful information\n"x
[...]
PROMPT="${my_info%x}My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
不会x …