所以远程传输协议使用一些奇怪的 shell 变量,如下所示:
xfer:log-file = 1
sftp:connect-program = “ssh -a -x -i keyfile”
我将如何设置这些变量?我尝试过使用set
, 和env
;以及直接xfer:log-file=1
- 但这些似乎都不起作用。
任何帮助,将不胜感激 :)
答案1
这些不是 shell 变量,它们是配置变量,是在CLI 提示符或配置文件中lftp
设置的变量,它们与任何lftp
lftp
lftp
壳(除非您想将lftp
自己视为 shell,因为它在某种程度上是类 shell 语言的解释器,甚至可以使用其!
运算符执行命令(尽管它依赖于真正的 shell))。
如果您希望使用相同的名称定义 shell 变量(但为什么要这样做?),请注意大多数 shell 对于变量名称可以包含的字符有很多限制。
对于大多数 shell,变量名称以字母或下划线开头(可以是 ASCII 字母或字母字符,由某些 shell 中的区域设置定义),并且仅由字母、十进制数字和下划线组成。
有些 shell 喜欢rc
或允许变量名中包含es
任何字符(除了=
(for ) 和 NUL):rc
; a:b = c
; echo $'a:b'
c
bash
,yash
并且某些版本zsh
允许在您的语言环境中将字符分类为字母顺序,因此您可以通过:
构建一个被分类为字母顺序的自定义语言环境来欺骗这些 shell 接受作为有效的变量名称字符:
,但这将是一个相当糟糕的主意,并且一定会破坏东西(例如在and${var:something}
中已经有特殊含义)。bash
zsh
现在环境变量名可以包含除 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
.