相关疑难解决方法(0)

为什么 shell 命令替换会吞下尾随的换行符?

根据以下示例,以及我最近的问题 在 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 操作必须有一些非常重要的原因,即命令替换,从它正在替换的命令输出中实际删除一些数据......
但我无法理解这个,因为它似乎是它该做什么的对立面......即。将命令的输出传递回脚本进程......保留一个字符对我来说似乎很奇怪,但我认为有一个合理的原因......我很想知道这个原因是什么...... .

shell text-processing command-substitution

27
推荐指数
3
解决办法
5915
查看次数

打印包含换行符的变量时,为什么最后一个换行符被删除?

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 添加一个换行符。

shell command-substitution newlines

9
推荐指数
1
解决办法
1321
查看次数

防止命令替换删除尾随换行符的优雅方法

我正在自定义我的 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 …

prompt zsh function command-substitution newlines

7
推荐指数
1
解决办法
1302
查看次数