他のユーザーの変数をエコーするときに奇妙な出力

他のユーザーの変数をエコーするときに奇妙な出力
$ 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の実行が含まれるかもしれませんが、私は知らず、あなたも言っていません)。

おすすめ記事