lightdm/gnome/compizはshの代わりにbashを使用できますか?

lightdm/gnome/compizはshの代わりにbashを使用できますか?

私のUbuntu 12.04では、lightdmユーザーのインスタンスを起動してログインを処理し、ユーザーがクリックしたアプリケーションを起動します。このパスのどこかでファイルを取得できますが、ユーザーのログインシェルの状態に関係なく、ファイルを取得した人がこれを実行するために使用されます。gnome-sessioncompiz.profile/bin/sh/etc/passwd

これは私にとって問題です。ログイン時にbashシェル機能を設定してエクスポートします~/.profile

l() {
  ls -la "$@"
}
export -f l

しかし、私のログインシェルが宣言したbashときに予想したように、このファイルは現在aから読み込まれません。代わりにa(私の場合はリンクされています)から読み取られ、このステートメントを処理できません。/etc/passwdbashshdashexport -f l

lightdm//を使用する代わりにログインシェルをgnome尊重する方法はありますか?どこかにこれの設定はありますか?compiz/etc/passwdsh

答え1

最後の手段ですぐに上書きできますbash。から.profile始めることができます

read -r cmd rest < <(cat /proc/$$/cmdline | tr '\000' ' ')
if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
  exec /bin/bash "$rest"
fi

#... the rest of the .profile script

私はそれがうまくいくと信じています。少しテストしてみてください。

編集する:

$0以前のバージョンでは、スクリプトを実行したのはbashではなく一般的なスクリプト名で、$@実行中のスクリプトの名前が含まれていなかったため、機能しませんでした。そのため、コマンドラインをproc実際に正確に再現するために元のコマンドラインをインポートしますが、まだ存在しない場合は、最初の引数(シェル)をbashに置き換えますbash(削除するifと無限再帰が発生します)。

proc空白の代わりにヌル文字の区切り文字を使用して読書が厄介になるので、私たちの生活は少し難しくなります。しかし、それは問題ではありません。

スミスエージェントがマトリックスの人々を覆うように、上の殻も覆われています。何も残っていませんdash。 PIDdashとその中のすべてはによって引き継がれますbash。新しいbashスクリプトを再実行します(今回は最後に到達しました)。

.profilebashにパラメータとして渡されず、初期化中に実行されたことを覚えています(ソース)。具体的な状況を慎重に確認する必要があります。おそらく実際に強制的に実行し、exec /bin/bash --loginコマンドラインを読むの面倒を避ける方が良いかもしれません。とにかくログインシェルはそれを読む必要があります.profile

したがって、最終推奨事項は次のとおりです。

if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
  exec /bin/bash --login
fi

最初から溝に入り、.profile何が起こるかを確認してください。理想的には、ログインシェルがすでにbashの場合は違いはありませんが、他のすべてのシェルはユーザーに通知せずにbashで透明にオーバーライドする必要があります。

関連情報