Как захватить новые строки из вывода подстановки команд в оболочке рыбы?

В bash символы новой строки сохраняются за счет подстановки команд:

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

Однако, когда я пытаюсь сделать то же самое в оболочке рыбы, символы новой строки преобразуются в пробелы:

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

Как заставить рыбу сохранять символы новой строки как новые строки?


person tomekwi    schedule 08.04.2015    source источник
comment
Рыбий панцирь слишком старается быть другим. Я бы все отдал за оболочку с bash в качестве языка сценариев и интерактивными функциями fish, такими как подсветка синтаксиса и история.   -  person BallpointBen    schedule 16.09.2018


Ответы (2)


Концептуально они не преобразуются в пробелы: вы получаете список!

> 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

Поэтому мы применяем механизм, доступный для списков; например, объединение с разделителем (обратите внимание на дополнительный пробел, чтобы избавиться нежелательных пространств):

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

Это не идеально; string делает это лучше:

> string join \n $myFoo
1
2
3
person Raphael    schedule 14.07.2018

Точная проблема обсуждалась в списке рассылки пользователей 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"
person glenn jackman    schedule 08.04.2015
comment
Спасибо за отзыв. Он работает как шарм, но выдает некоторые ошибки из fish_prompt, в то время как IFS установлено на "". Знаете ли вы о каких-либо планах сделать это в одну строку и подавить ошибки? - person tomekwi; 08.04.2015
comment
В этой ветке списка рассылки есть несколько ссылок на средство отслеживания проблем с рыбой. - person glenn jackman; 08.04.2015