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スクリプトを取得して関数を呼び出せるようにすることです。ここで私はどこで間違っていますか?