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

Обычно вещи, которые просят узел устройства как /dev/sda1 смотрят на чтение-запись блочное устройство вместо узла файла. Каталог в смонтированной файловой системе является совершенно другим видом объекта, чем узел блочного устройства.

Иногда вещи, которые обычно воздействовали бы на устройство, могут воздействовать на файл. Например, различные форматы файлов как ISO и dmg являются в основном "изображениями" блочных устройств, сохраненных в файле в некоторой файловой системе хоста, которая может иметь их собственные структуры файловой системы в них. Некоторое программное обеспечение знает, как иметь дело с подобными "файлами".

Кажется, существуют некоторые примечания о fileio по сравнению с blockio в на сайте, который Вы связываете, хотя это документация совсем не завершено. Это могло бы быть чем-то для изучения.

1
03.11.2015, 16:03
1 ответ

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

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

В большинстве оболочек имена переменных начинаются с буквы или знака подчеркивания (в некоторых оболочках это могут быть буквы 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, который не отображает переменные окружения на свои конфигурационные переменные AFAIK).


Чтобы установить эти 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.

7
27.01.2020, 23:13

Теги

Похожие вопросы