在bash中的命令替换内传递变量的问题

问题描述

我想运行sort并将其传递给LC_COLLATE=C。然后将输出存储在变量中。

我写了这个:

var="$(LC_COLLATE=C sort 'aaa
Abc')"

但是,奇怪的是,我收到了sort: No such file or directory。我的系统上肯定有sortcommand -v sort说它在/usr/bin/中。我还尝试将sort更改为专门说/usr/bin/sort,但这也不起作用。

我知道命令替换有时会阻塞变量,但是我认为这与从变量中删除变量有关,而不是相反。

编辑:这似乎也发生在命令替换之外。正在运行:

LC_COLLATE=C sort 'aaa
Abc'

也给了我同样的错误。我发现,如果我不使用多行引号,该错误就会消失,但我无法解释原因。

解决方法

sort找不到的文件名为aaa<newline>Abc。如果要将字符串发送到sort的标准输入,请使用here字符串:

var=$(LC_COLLATE=C sort <<< 'aaa
Abc')

或此处文档:

var=$(LC_COLLATE=C sort << EOF
aaa
Abc
EOF
)