如何从 fish shell 中的命令替换输出中捕获换行符?

How to capture newlines from command substitution output in fish shell?

在bash中,通过命令替换保留换行符:

$ TEST="$(echo 'a
  b
  c
  ')" && echo "$TEST"
# →
a
b
c

但是,当我尝试在 fish shell 中执行相同操作时,换行符被转换为空格:

$ set TEST (echo "a
  b
  c
  "); and echo "$TEST"
# →
a b c

如何让fish将换行符保存为换行符?

在 fish 用户邮件列表上讨论的确切问题:在 fish 用户邮件列表上讨论:http://sourceforge.net/p/fish/mailman/message/33644843/

您必须修改 IFS 变量才能执行此操作:

$ set out (seq 5)
$ echo "$out"
1 2 3 4 5

$ set oldIFS "$IFS"
$ set IFS ""
$ set out (seq 5)
$ echo "$out"
1
2
3
4
5
$ set IFS "$oldIFS"

从概念上讲,它们不会转换为空格:您得到的是一个列表!

> echo -e "1\n2\n3" > foo
> cat foo
1
2
3
> set myFoo (cat foo)
> echo $myFoo
1 2 3
> echo $myFoo[0..2]
1 2

因此我们应用可用于 lists; for instance, joining with a separator 的机制(注意额外的退格键以去除不需要的空格):

> echo {\b$myFoo}\n
1
2
3
 # extra newline here

这并不理想; string 做得更好:

> string join \n $myFoo
1
2
3