fish在换行符上拆分命令替换.这意味着这$lines
是一个列表.你可以阅读更多关于此列表.
将列表传递给命令时,列表中的每个条目都将成为单独的参数.echo
空格分隔其论点.这解释了你所看到的行为.
请注意,其他shell在这里做同样的事情.例如,在bash中:
lines=$(cat .lorem) echo $lines
如果要阻止拆分,可以暂时将IFS设置为空:
begin set -l IFS set lines (cat .lorem) end echo $lines
现在$lines
将包含换行符.
正如faho所说,read
也可以使用并且更短一些:
read -z lines < ~/.lorem echo $lines
但请考虑是否可能实际上是您想要的换行.正如faho暗示的那样,您的sed
脚本可以替换为数组切片:
set lines (cat .lorem) echo $lines[2..4] # prints lines 2 through 4