Fish

fish shell - 這種語法有什麼問題?

  • September 11, 2022

我有一個 bash 腳本,它cat是一個 heredoc 字元串,我在fish shell中執行它,然後將它傳遞給一個source呼叫,如下所示:

~/foo/baz:

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

從fish shell:

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 shell中時,等效的函式 + switch 語句可以正常工作:

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在文件和複製/粘貼到 shell 中的程式碼中都有相同的語句數baz,所以我懷疑錯誤語句是紅鯡魚?如果是這樣,我不知道真正的錯誤可能是什麼。

我的目標是能夠在 bash 腳本的 heredoc 字元串中構造一個 fish 函式,然後從 fish 腳本中獲取該 bash 腳本,以便我可以呼叫該函式。我在這裡哪裡做錯了?

變數 ( $myVar) 在 heredocs 中得到擴展,除非您引用它:

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

參考 3.6.6 此處的文件

引用自:https://unix.stackexchange.com/questions/716957