我正在撰寫一個腳本來將一些檔案移動到遠程服務器(有關更多詳細資訊,請參閱: 此處檔案中的函式呼叫以獲取 unix shell 腳本)。為了允許腳本在本地機器和遠程服務器上作業,我使用'declare -f'來包裝現有函式以遠程執行。到目前為止,我想出了這個:
腳本檔案
REMOTE_HOST=myhost
TMP=eyerep-files
getMoveCommand()
{
echo Src Dir: $2
sudo cp ~/$TMP/start.ini ~/$1/start_b.ini
ls ~/$2
echo Target Dir: $1
ls ~/$1
}
moveRemote()
{
echo "attempting move with here doc"
echo $(declare -fp getMoveCommand )
ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand); getMoveCommand ${1@Q} ${TMP@Q}"
}
moveFiles()
{
case "$1" in
# remote deploy
remote)
moveRemote $2
;;
# local deploy
local)
getMoveCommand $2
;;
*)
echo "Usage: myscript.sh {local|remote}"
exit 1
;;
esac
}
moveFiles $1 $2
exit 0
如果使用 './myscript.sh remote dev' 呼叫,腳本應該 ssh 進入遠程服務器并將檔案從一個檔案夾移動到另一個檔案夾。我遇到的問題是字串替換。我有一堆全域變數充當 getMoveCommand 需要訪問的常量。在此處的示例中,只有一個 (TMP),因此我可以簡單地將其作為引數傳遞。然而,在實際腳本中,正在完成的作業更加復雜,并且需要傳入的引數數量會使這個解決方案變得笨拙。由于這些變數永遠不會改變,似乎應該可以在將包裝函式發送到 ssh 之前強制進行字串替換。
我想做的事情是否可能,如果可以,怎么做?如果沒有,是否有另一種不需要向函式傳遞大量引數的方法來處理這個問題?
uj5u.com熱心網友回復:
如果您匯出變數,則可以使用 envsubst:
export TMP=foo
getMoveCommand() {
echo TMP is $TMP
}
declare -fp getMoveCommand|envsubst
上面的腳本列印:
getMoveCommand ()
{
echo TMP is foo
}
uj5u.com熱心網友回復:
您還可以使用declare -p以下方式發送全域變數:
ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand; declare -p GLOBAL_VAR_1 GLOBAL_VAR_2)"$'\n'"getMoveCommand ${1@Q} ${TMP@Q}"
您還可以使用另一個全域變數來宣告它們,以便輕松擴展它們:
GLOBAL_VARS=(GLOBAL_VAR_1 GLOBAL_VAR_2)
...
ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand; declare -p "${GLOBAL_VARS[@]}")"$'\n'"getMoveCommand ${1@Q} ${TMP@Q}"
如果你的變數有一個共同的前綴,你也可以通過"${!PREFIX@}". 無需存盤到變數中。
或者還不如創建一個“匯出”功能來保持清潔:
dump_env() {
declare -fp getMoveCommand
declare -p GLOBAL_VAR_1 GLOBAL_VAR_2
}
...
ssh -t "$REMOTE_HOST" "$(dump_env)"$'\n'"getMoveCommand ${1@Q} ${TMP@Q}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/405839.html
標籤:
上一篇:環境變數與全域變數
下一篇:使用終端命令find洗掉擴展名
