$ sudo su - user1 -c 'echo $DOMAIN_HOME'
/app/user1/DOMAINHOME
これはよさそうですね。しかし、もう少し詳しく見てみましょう。
$ sudo su - user1 -c 'echo $DOMAIN_HOME' | tee test.out
$less test.out
ESC]P0000000ESC]P8A9A9A9ESC]P1DC143CESC]P9FF0000ESC]P2008000ESC]PA00FF00ESC]P3aa9943ESC]PBFFD700ESC]P41E90FFESC]PC87CEFAESC]P5706c9aESC]PD826ab1ESC]P6FFA500ESC]PEF0F8FFESC]P7FFFFFFESC]PFFFFFFFESC[HESC[2JESC[HESC[2J/app/user1/DOMAINHOME
これによりスクリプトが失敗します。
これはxtermに色を提供する.bashrcのカラーコードです。ちょっとした調査の終わりに最後の部分[HESC[2JESC[HESC[2J]]パスを出力する前に端末の内容を消去します。
私はこれらの現象がなぜ起こるのかを調べるために頭をつかみました。どんなアイデアがありますか?
注:user1としてログインすると、この変数は正常に表示されます。
答え1
"su -"を使用しているので、実行シェルはログインシェルであるかのようになります(システム/etc/profile
、ユーザープロファイルなどを.profile
実行します.bash_profile
)。これらのスクリプトの1つはエスケープシーケンスをEsc]P
生成し、結果を標準出力に出力します。そうしてはいけません。
やるべきことは、シェルが対話型であることを確認することです。それから——その時だけ! - エスケープシーケンスを作成する必要があります。
インタラクティブシェルをチェックする最善の方法は、「$-」値を確認し、その文字が含まれていることを確認することです。i
含まれている場合、シェルは対話型で、そうでなければシェルはそうではありません。私は通常、次のようなものを使用します。
case "$-" in
*i*) # Here if the shell is interactive
;;
*) # Here otherwise
;;
esac
エスケープシーケンスを生成した項目を確認する必要があります。一般的な原因は、端末設定を変更する必要がある、echo
およびその他のコマンドです。tput
私はいくつかのインターネット検索をしましたが、特定のエスケープシーケンスが見つからなかったため、どこ/何を見つけるべきかについての手がかりを提供することはできません。
もちろん、なぜ使用しますかsu -
?sudo -u user1
追加の手順を使用して削除します(user1
あなたの要件に.profileの実行が含まれるかもしれませんが、私は知らず、あなたも言っていません)。