bash はコロン (:) とダッシュ (-) を含む変数を設定します (lftp で使用されるものと同じ)

bash はコロン (:) とダッシュ (-) を含む変数を設定します (lftp で使用されるものと同じ)

それでlftp次のような奇妙なシェル変数を使用します。

xfer:log-file = 1

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

setこれらの変数をどのように設定すればよいでしょうか? 、 、env; を使用したり、単に直接使用したりしてみましたxfer:log-file=1が、いずれも機能しないようです。

ご協力いただければ幸いです:)

答え1

これらはシェル変数ではなく、 CLIプロンプトまたは設定ファイルでlftp設定される設定変数であり、lftplftplftpシェルlftp(ただし、シェルのような言語のインタープリターであり、演算子を使用してコマンドを実行することもできるため、シェルとして考える場合は除きます!(ただし、そのためには実際のシェルに依存します))。

シェル変数を同じ名前で定義したい場合 (しかし、なぜそうする必要があるのでしょうか?)、ほとんどのシェルでは変数名に含めることができる文字に関して多くの制限があることに注意してください。

ほとんどのシェルでは、変数名は文字またはアンダースコアで始まり (一部のシェルではロケールで定義されている ASCII 文字またはアルファベット文字を使用できます)、文字、小数点、アンダースコアのみで構成されます。

一部のシェルではrc、変数名にes任意の文字 ( および NUL を除く) を使用できます=rc

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

bashyashおよび の一部のバージョンでは、ロケールzshでアルファベットとして分類される文字が許可されるため、 がアルファベットとして:分類されるカスタム ロケールを作成することで、それらのシェルが を有効な変数名文字として受け入れるように:仕向けることは可能ですが、これはむしろ悪い考えであり、確実に問題が発生します (たとえば、 は およびで${var:something}既に特別な意味を持っています)。bashzsh

環境変数名には、NUL と 以外の任意の文字を含めることができます。したがって、または=を含むコマンドに環境変数を渡すことができます。:-

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

ただし、シェル ( rc/を除くes) はそれらを使用できず、一部のシェルはそれらを environ から削除する可能性があることに注意してください (これは、lftp環境変数をその構成変数にマップしない which には影響しません)。


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

関連情報