bash 設定帶有冒號 (:) 和破折號 (-) 的變數(如 lftp 使用的)

bash 設定帶有冒號 (:) 和破折號 (-) 的變數(如 lftp 使用的)

所以遠端傳輸協定使用一些奇怪的 shell 變量,如下所示:

xfer:log-file = 1

sftp:connect-program = “ssh -a -x -i keyfile”

我將如何設定這些變數?我嘗試過使用set, 和env;以及直接xfer:log-file=1- 但這些似乎都不起作用。

任何幫助,將不勝感激 :)

答案1

這些不是 shell 變量,它們是配置變量,是在CLI 提示符或配置文件中lftp設置的變量,它們與任何lftplftplftp(除非您想將lftp自己視為 shell,因為它在某種程度上是類別 shell 語言的解釋器,甚至可以使用其!運算子執行命令(儘管它依賴真正的 shell))。

如果您希望使用相同的名稱定義 shell 變數(但為什麼要這樣做?),請注意大多數 shell 對於變數名稱可以包含的字元有很多限制。

對於大多數 shell,變數名稱以字母或底線開頭(可以是 ASCII 字母或字母字符,由某些 shell 中的區域設定定義),並且僅包含字母、十進制數字和底線。

有些 shell 喜歡rc或允許變數名稱中包含es任何字元(除了=(for ) 和 NUL):rc

; a:b = c
; echo $'a:b'
c

bashyash並且某些版本zsh允許在您的語言環境中將字符分類為字母順序,因此您可以通過:構建一個被分類為字母順序的自定義語言環境來欺騙這些 shell 接受作為有效的變量名稱字符:,但這將是一個相當糟糕的主意,並且一定會破壞東西(例如在and${var:something}中已經有特殊含義)。bashzsh

現在環境變數名可以包含除 NUL 和 之外的任何字元=。因此,您可以將環境變數傳遞給包含:或 的命令-

$ env foo:bar=baz printenv foo:bar
baz

但請注意,shell(除rc/es之外)將無法使用它們,某些 shell 甚至可能會將它們從環境中刪除(這不會影響lftp不將環境變數對應到其配置變數的情況)。


lftp要在啟動時設定這些變量,您可以執行以下操作:

lftp -e 'set xfer:log-file transfer.log' sftp://server/

或將其嵌入 lftp 腳本中以進行非互動式使用:

lftp -c '
   set xfer:log-file transfer.log
   get https://unix.stackexchange.com/questions/240502'

或者

#! /usr/bin/lftp -f
set xfer:log-file transfer.log
get https://unix.stackexchange.com/questions/240502

或者您可以將這些變數定義加入到您的~/.lftp/rc.

相關內容