Bash: SSH 遠端執行函數、typeset 或 declare



前言

  • 之前實作 ssh 遠端執行 script 時,如果要在遠端宣告 function 並執行的話,需要用 typeset / declare 指定成函數。順便記錄在這篇



說明

遠端執行指令

  • 假設要用 SSH 在遠端執行指令,通常都這樣寫:
1
2
3
4
5
ssh <remote_server> "<command>"


# e.g. 檢查遠端 server 的時間
# ssh my_remote_test_server "date"
  • 不過如果要執行比較複雜的工作,先宣告成函數會比較好處理:
1
2
3
4
5
6
7
function remote_work () {
  echo "hostname: $(hostname)"
  date
  whoami

  # ... etc
}

但是,如果比照上面的寫法,直接丟入函數會有問題:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function remote_work () {
  echo "hostname: $(hostname)"
  date
  whoami

  # ... etc
}

# 會出現錯誤 !!
ssh my_remote_test_server "remote_work"

typeset / declare

  • 解決辦法,就是宣告該字串或指令 remote_work 是一個函數,讓 remote server 能夠正確處理。
    → 用 typeset 或是 declare 指令:
1
2
3
4
ssh my_remote_test_server "$(declare -f <span style="font-family: inherit; font-size: inherit; background-color: inherit;">remote_work); <span style="font-family: inherit; font-size: inherit; background-color: inherit;">remote_work"

# OR
ssh my_remote_test_server "$(typeset -f <span style="font-family: inherit; font-size: inherit; background-color: inherit;">remote_work); <span style="font-family: inherit; font-size: inherit; background-color: inherit;">remote_work"

其中,-f 指的是

  • -f:restrict action or display to function names and definitions

也就是先讓 remote server 知道那是一個 function。

至於到底要用 typeset 還是 declare

  • 原則上兩者幾乎是一樣的指令

  • 但是 typeset 是較老舊的寫法,且只有在某些相對少用的 shell ,才會只支援 typeset 而不支援 declare

  • 如果是一般常用的環境,建議寫 declare 比較好。




REF


主題 StackJimmy 設計