bash устанавливает переменную с двоеточием (:) и тире (-) внутри (как используется lftp)

bash устанавливает переменную с двоеточием (:) и тире (-) внутри (как используется lftp)

такфтписпользует некоторые странные переменные оболочки, например следующие:

xfer:log-file = 1

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

как мне задать эти переменные? Я пробовал использовать set, и env; а также просто напрямую xfer:log-file=1- но ни один из них, похоже, не работает.

Любая помощь будет оценена по достоинству :)

решение1

Это не переменные оболочки, это lftpпеременные конфигурации, переменные, заданные lftpв lftpкомандной строке CLI или в lftpфайлах конфигурации, они не имеют никакого отношения коболочка(если только вы не хотите считать lftpего оболочкой, поскольку он в некотором роде является интерпретатором языка, похожего на оболочку, и даже может выполнять команды с помощью своего !оператора (хотя для этого ему нужна настоящая оболочка)).

Если вы хотите, чтобы переменные оболочки были определены с одинаковыми именами (но зачем вам это?), учтите, что большинство оболочек имеют множество ограничений на то, какие символы могут содержать имена их переменных.

Для большинства оболочек имена переменных начинаются с буквы или символа подчеркивания (могут быть буквами ASCII или алфавитными символами, как определено в вашей локали в некоторых оболочках) и состоят только из букв, десятичных цифр и символа подчеркивания.

Некоторые оболочки, например rcили , esдопускают любой символ (кроме =(для rc) и NUL) в имени переменной:

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

bash, yashа некоторые версии zshдопускают символы, классифицированные как алфавитные в вашей локали, поэтому вы, возможно, могли бы обмануть эти оболочки, заставив их принять :в качестве допустимого имени переменной символ, создав пользовательскую локаль, где :классифицирован как алфавитный, но это было бы довольно плохой идеей и наверняка все сломает (например, ${var:something}уже имеет особое значение в bashи zsh).

СейчассредаИмена переменных могут содержать любые символы, кроме NUL и =. Таким образом, вы можете передать переменную окружения команде, которая содержит :или -:

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

но учтите, что оболочки (кроме rc/ es) не смогут их использовать, а некоторые оболочки могут даже удалить их из окружения (и это не повлияет на 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.

Связанный контент