web-dev-qa-db-ja.com

/ etc / environment内のハッシュマーク(#)をエスケープする

/etc/environmentにenv変数を追加していますが、変数の値に#記号が含まれているため、文字列がストライプ化されています。

MYSQL_PWD="something#no"

上のコードをenvすると、MYSQL_PWD=somethingが生成されます。どうすればハッシュをエスケープできますか?私はすでに\のキャラクターを試しました。

18
Umair A.

これは/etc/environmentでは可能ではないようです。シェルに依存しない変数の共通の場所として意図されています。これを考えると、ハッシュマーク(#)を含む文字列をサポートしているようには見えず、エスケープする方法がないようです。

Linux etc/environmentで先頭の「#」文字を適切にエスケープするにはどうすればよいですか? というタイトルのこのSF Q&Aを見つけました。これらの方法はどれも機能しませんでした:

  • control = "hello"
  • test0 = "#hello"
  • test1 = "h\#Ello"
  • test2 = "h#Ello"
  • test3 = "h //#Ello"
  • test4 = "h /#Ello"
  • test5 = h#Ello
  • test6 = h\#Ello
  • test7 = h#Ello
  • test8 = h //#Ello
  • test9 = h /#Ello
  • test10 = 'h#Ello'
  • test11 = 'h\#Ello'
  • test12 = 'h#Ello'
  • test13 = 'h //#Ello'
  • test14 = 'h /#Ello'

その質問に対する受け入れられた答えと私のアドバイスは何でしょうか:

まあそれはあなたがやりたいトリッキーなものです/etc/environmentはシェル構文ではありません、それは1のように見えますが、そうではありません、それは人々を苛立たせます。 /etc/environmentの背景にあるアイデアは素晴らしいものでした。変数を設定するためのシェルに依存しない方法!わーい!しかし、実際的な制限により、それは役に立たなくなります。

そこに変数を渡すことはできません。例えばMAIL=$HOME/Maildir/をそれに入れて、何が起こるか見てみましょう。ああ、どんな目的でもそれを使用しようとするのをやめるのが一番です。そのため、シェルで処理された場合に実行できると期待することはできません。

/etc/profileまたは/etc/bashrcを使用します。

それでも 別のQ&A は、なぜこれが当てはまるのかについて、この合理的な説明を示しています。

/etc/environmentは、PAMモジュール "pam_env"によって解析され、KEY = VALペアの単純なリストとして処理されて設定されるため、#(コメントとして扱われる)をエスケープする方法はありません。それに応じて環境。これはbash/Shellではなく、パーサーには変数の展開や文字のエスケープを行うための言語がありません。

参考文献

19
slm

おそらく手遅れですが、つのバックスラッシュの前に#は私のために働きました。

パスワードが「admin#123」の場合、次のように定義できます。

admin\\\#123
1
Sai Sivaram

二重引用符内の単一引用符が私にとってうまくいきました。誰かを助けるかもしれない

test="'h/#Ello'"
0
Grinish Nepal