我有一个 bash 脚本,其中cat
包含heredoc字符串,我在 Fish shell 中运行它,然后将其通过管道传递给调用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>'
当我将等效函数 + switch 语句直接粘贴到 Fish shell 中时,它可以正常工作:
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!
我在文件和复制/粘贴到 shell 中的代码中都有相同的end
语句# ,所以我怀疑错误语句是转移注意力?baz
如果是这样,我不知道真正的错误可能是什么。
我的目标是能够在 bash 脚本的定界符字符串内构造一个fish函数,然后从fish脚本中获取该bash脚本,以便我可以调用该函数。我这里哪里出错了?