Оболочка рыбы — Как интерполировать подкоманду?

#interpolation #fish

#интерполяция #рыба

Вопрос:

В bash я могу сказать:

 $ echo "a$(echo b)c"
abc
  

Как мне сделать это в оболочке рыбы?

Комментарии:

1. echo a(echo b)c … см . fishshell.com/docs/current/index.html#expand

Ответ №1:

 echo a(echo b)c
  

Если у вас есть кавычки, вы должны выйти из них:

 echo "a"(echo b)"c"
  

Если в вашей подкоманде могут быть новые строки, начиная с fish 2.3, вам необходимо сохранить и восстановить $IFS:

 set -l IFS 
echo "a"(cat ~/file.txt)"c"
set -e IFS
  

В конечном итоге string вы сможете справиться с этим случаем.

Комментарии:

1. Это каким-то образом проглотит все символы новой строки и, по-видимому, не является эквивалентным. Минимальный пример: учитывая echo -e "anb" > x , что тогда bash echo "$(cat x)" делает правильные вещи, тогда как fish echo (cat x) преобразует новую строку в пробел (что было бы эквивалентно bash echo $(cat x) без кавычек).

2. Неужели по-прежнему нет другого способа сделать это, кроме как установить IFS значение empty ?

3. string collect теперь доступно, чтобы избежать разделения новой строки. Пример использования: echo (cat x | string collect)