避免修剪bash $()输出

l0b*_*0b0 4 bash newline

从Bash手册:

Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,删除任何尾随换行符.

这意味着在处理具有有意义的尾随换行符的输出时,可能会出现模糊的错误.一个人为的例子:

user@host:~$ path='test

'
user@host:~$ touch -- "$path"
user@host:~$ readlink -fn -- "$path"
/home/user/test

user@host:~$ full_path="$(readlink -fn -- "$path")"
user@host:~$ ls -- "$full_path"
ls: cannot access /home/user/test: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有关如何将命令的值赋给变量而不丢失语义上有用的数据的任何提示?

Bash的冒险继续另一天!

Pet*_*den 7

您可以使用引用并eval解决此问题.将最后两个命令更改为:

full_path="'$(readlink -fn -- "$path"; echo \')"
eval ls -- "$full_path"
Run Code Online (Sandbox Code Playgroud)

如果您希望结果在变量中包含尾随换行符,则可以先添加伪造字符(在本例中为下划线),然后将其删除.

full_path="$(readlink -fn -- "$path"; echo _)"
full_path=${full_path%_}
ls -- "$full_path"
Run Code Online (Sandbox Code Playgroud)