ダッシュで始まるCLI引数とともに使用すると、ティルダ(〜)が展開しないのはなぜですか?


9

私はVNCサーバー(x0vncserver)を実行しようとして数時間を失い、クライアントは奇妙なメッセージで接続を拒否しました。

No password configured for VNC Auth

サーバーもこのエラーを出力します

 SVncAuth:    opening password file '~/.vnc/passwd' failed

さて、チルダがシェルによってもx0vncserverによっても拡張されないことに気づくまで、私は多くの時間を無駄にしました。次に、これらのテストを実行しました

$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd

だが

$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd

何故ですか?引数がダッシュで始まる場合、シェルがチルダの展開を拒否するのはなぜですか?チルドは引用されていない限り常に拡張すると思いましたが、明らかに別のルールが関係しているのでしょうか?



回答:


13

これは、bashそのマニュアルに記載されているシェルの特殊性です。

また、Bashは、変数割り当ての条件(上記の「パラメーター」で説明)を満たす単語が単純なコマンドの引数として出現する場合、その単語に対してチルダ展開を実行します。Bashは、posixモードの場合、上記の宣言コマンドを除いて、これを行いません。

これは、それbash 変数割り当てのように見えるPasswordFile=~/.vnc/passwd引数であるので、文字列のチルダ展開すること意味しますecho

文字列--PasswordFile=~/.vnc/passwd--PasswordFile有効な変数名ではないため、文字列は変数割り当てのようには見えません。

注意bashPOSIXモードで実行するときにこれを実行しないと、その他のシェルのようなzshkshあるいはyashデフォルトでこれをしない(zshmagicequalsubstチルダ展開のためのオプションは、引用符で囲まれていない等号の後に実行される(=)が)。

現在のユーザーのホームディレクトリパスがコマンドの引数の一部として適切に展開されていることを確認する場合$HOMEは、チルドの代わりに値を使用します。

echo --PasswordFile="$HOME/.vnc/passwd"

「宣言上記コマンド」マニュアルで言及は、コマンドに内蔵されているaliasdeclaretypesetexportreadonly、およびlocal


1
+1 | 私はそれを考えません。
LinuxSecurityFreak

:ノートけれどもbash --posix -c '"export" a=~; printf "%s\n" "$a"'出力~
ステファンChazelas

2
~展開されてalias a=~いるのはPOSIX準拠のバグであることに注意してください(そして役に立ちません)。しかし、それがksh88がそれを行った方法(ksh93で変更されたもの)であり、おそらくbash、zsh、およびpdkshが同様に行った理由です。なぜyashPOSIX仕様に基づいて作成されたのですか。
ステファンChazelas

これは正しい答えですが、正しいアプローチは、オプションの引数=を1つの引数にマージするのではなく、オプションの引数を別の引数として提供することでした。次に、チルダ拡張は単語の最初にあり、質問は議論の余地があります。
JdeBP

1
@JdeBP、たまたまの場合x0vncserverx0vncserver --PasswordFile file機能しません--PasswordFile=file。必要です。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.