変数の値が$
署名されたとします(Java内部クラスの格納パス)。
現在のユーザーと他のユーザーの両方で処理したい(現在のユーザーを想定してroot
コマンドを使用するときにパスワードを入力する必要はありませんsu
)。
例:
path_value=/home/username/filename\$1.class
echo ${path_value}
su username -c "echo ${path_value}"
最初の結果echo
:
/home/username/filename$1.class
echo
2番目の内部コマンドの結果su
:
/home/username/filename.class
両方の場所で同じ値で処理できるように、その変数を使用したいと思います。
ベストアンサー1
環境を介して値をエクスポートし、内部シェルから拡張するようにします。仮想username
ログインシェルはBourneに似ています。
$ export path_value=/home/username/filename\$1.class
$ su username -c 'echo "$path_value"'
/home/username/filename$1.class
これは、変数に引用符が含まれていても機能しますが、使用されたコマンドが環境を消去している場合は機能しません。私はそれがsu
行われるべきだとは思わないが、sudo
そうなるかもしれない。
変数に一重引用符²を含めることができないことがわかっている場合は、内部シェルで文字列を一重引用符に拡張できます。
$ path_value=/home/username/filename\$1.class
$ su username -c "echo '$path_value'"
/home/username/filename$1.class
(引用の順序は逆ですので参考にしてください。)
¹username
ログインシェルがcsh
orの場合はtcsh
、orの派生物の場合echo "$path_value"
に置き換えます。
echo $path_value:q
rc
echo $path_value
csh
ユーザーのログインシェルがまたはの場合は²と改行文字を含み、ユーザーtcsh
のログインシェルが場合は有効な文字を形成しないバイトを含みませんyash
。また、-
バックスラッシュで始まるパラメータや含めるパラメータは問題を引き起こし、任意のデータecho
で使用するのが最善です。printf '%s\n'