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.

相关内容