suコマンドを使用して、値に$を含む変数を現在のユーザーと他のユーザーとして使用する機能

suコマンドを使用して、値に$を含む変数を現在のユーザーと他のユーザーとして使用する機能

変数の値が$署名されたとします(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

echo2番目の内部コマンドの結果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ログインシェルがcshorの場合はtcsh、orの派生物の場合echo "$path_value"に置き換えます。 echo $path_value:qrcecho $path_value

cshユーザーのログインシェルがまたはの場合は²と改行文字を含み、ユーザーtcshのログインシェルが場合は有効な文字を形成しないバイトを含みませんyash。また、-バックスラッシュで始まるパラメータや含めるパラメータは問題を引き起こし、任意のデータechoで使用するのが最善です。printf '%s\n'

おすすめ記事