bash set variável com dois pontos (:) e traço (-) nele (como usado pelo lftp)

1

lftp usa algumas variáveis de shell estranhas, como as seguintes:

xfer:log-file = 1

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

como eu configuraria essas variáveis? Eu tentei usar set e env ; bem como apenas xfer:log-file=1 - mas nenhum deles parece funcionar.

Qualquer ajuda seria apreciada:)

    
por simonalexander2005 03.11.2015 / 15:03

1 resposta

7

Essas não são variáveis de shell, são lftp de variáveis de configuração, variáveis definidas para lftp no prompt lftp CLI ou em lftp arquivos de configuração, elas não têm nada a ver com shell (a menos que você queira considerar lftp como shell, pois é de alguma forma um interpretador para uma linguagem semelhante a shell e pode até mesmo executar comandos com seu operador ! (embora ele dependa de uma shell real para isso)) .

Se você quiser que as variáveis do shell sejam definidas com o mesmo nome (mas por que você faria isso?), tome cuidado, pois a maioria dos shells tem muitas restrições sobre quais caracteres o nome de suas variáveis pode conter.

Para a maioria dos shells, os nomes de variáveis começam com uma letra ou sublinhado (podem ser letras ASCII ou caracteres alfabéticos, conforme definido pela sua localidade em alguns shells) e consistem apenas em letras, dígitos decimais e sublinhados.

Alguns shells como rc ou es permitem qualquer caractere (exceto = (para rc ) e NUL) no nome da variável:

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

bash , yash e algumas versões de zsh permitem caracteres classificados como alfabéticos em sua localidade, portanto, você pode enganar essas conchas para aceitar : como um caractere de nome de variável válido construindo uma localidade personalizada onde : é classificado como alfabético, mas isso seria uma má ideia e certamente quebraria as coisas (por exemplo, ${var:something} já tem um significado especial em bash e zsh ).

Agora, os nomes das variáveis environment podem conter qualquer caractere, exceto NUL e = . Assim, você pode passar uma variável de ambiente para um comando que contenha : ou - :

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

mas observe que os shells (exceto rc / es ) não poderão usá-los e alguns shells poderão até mesmo removê-los do ambiente (e isso não afetará o lftp que não mapeia o ambiente variáveis para suas variáveis de configuração AFAIK).

Para definir as variáveis lftp na inicialização, você pode fazer:

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

Ou incorpore-o em um script lftp para uso não interativo:

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

Ou

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

Ou você pode adicionar essas definições de variáveis ao seu ~/.lftp/rc .

    
por 03.11.2015 / 15:28