Fish shell - 这个语法有什么问题?

Fish shell - 这个语法有什么问题?

我有一个 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脚本,以便我可以调用该函数。我这里哪里出错了?

答案1

变量 ( $myVar) 在此处文档中得到扩展,除非您引用它:

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

参考号 3.6.6 此处文档

相关内容