Fish shell - この構文にはどのような問題がありますか?

Fish shell - この構文にはどのような問題がありますか?

Fishシェルで実行し、次のように呼び出しcatにパイプするheredoc文字列を含むbashスクリプトがあります。source

~/foo/バズ:

  1 #!/usr/bin/env bash
  2 
  3 cat << EOS
  4   function bar
  5     echo 'Hello world'
  6   end
  7 EOS

魚の殻から見たもの:

richiethomas@richie ~/foo (master) [126]> ./baz | source
richiethomas@richie ~/foo (master)> bar

Hello world

上記のように、結果としてbar関数を実行すると呼び出すことができます./baz | source

barただし、関数の実装を次のように変更するとエラーが発生します。

  1 #!/usr/bin/env bash
  2 
  3 cat << EOS
  4   function bar 
  5     set myVar 5 
  6     switch $myVar 
  7       case 4 
  8         echo '4' 
  9       case 5 
 10         echo '5' 
 11       case '*' 
 12         echo 'Not found' 
 13     end 
 14   end
 15 EOS

これを実行しようとすると、source次のエラーが発生します。

richiethomas@richie ~/foo (master) [0|1]> ./baz | source
- (line 1): Missing end to balance this function definition
  function bar
  ^
from sourcing file -
source: Error while reading file '<stdin>'

同等の関数+スイッチステートメントをFishシェルに直接貼り付けると正常に機能します。

richiethomas@richie ~/foo (master) [0|1]> function bar
                                              set myVar 5
                                              switch $myVar
                                                  case 4
                                                      echo 'it is 4!'
                                                  case 5
                                                      echo 'it is 5!'
                                                  case '*'
                                                      echo 'not found'
                                              end
                                          end

richiethomas@richie ~/foo (master)> bar

it is 5!

endファイルとシェルにコピー/貼り付けたコードに同じ#ステートメントがあるため、間違ったステートメントが赤いニシンのようです。bazその場合、実際のエラーが何であるかはわかりません。

私の目標は、bashスクリプトの区切り文字列内でfish関数を設定し、fishスクリプトからそのbashスクリプトを取得して関数を呼び出せるようにすることです。ここで私はどこで間違っていますか?

ベストアンサー1

変数($myVar)は、引用しない限り、ここで文書に展開されます。

cat << 'EOS'
# .....^...^

参照番号 3.6.6 ここに文書化

おすすめ記事