私のUbuntu 12.04では、lightdm
ユーザーのインスタンスを起動してログインを処理し、ユーザーがクリックしたアプリケーションを起動します。このパスのどこかでファイルを取得できますが、ユーザーのログインシェルの状態に関係なく、ファイルを取得した人がこれを実行するために使用されます。gnome-session
compiz
.profile
/bin/sh
/etc/passwd
これは私にとって問題です。ログイン時にbashシェル機能を設定してエクスポートします~/.profile
。
l() {
ls -la "$@"
}
export -f l
しかし、私のログインシェルが宣言したbash
ときに予想したように、このファイルは現在aから読み込まれません。代わりにa(私の場合はリンクされています)から読み取られ、このステートメントを処理できません。/etc/passwd
bash
sh
dash
export -f l
lightdm
//を使用する代わりにログインシェルをgnome
尊重する方法はありますか?どこかにこれの設定はありますか?compiz
/etc/passwd
sh
答え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
スクリプトを再実行します(今回は最後に到達しました)。
.profile
bashにパラメータとして渡されず、初期化中に実行されたことを覚えています(ソース)。具体的な状況を慎重に確認する必要があります。おそらく実際に強制的に実行し、exec /bin/bash --login
コマンドラインを読むの面倒を避ける方が良いかもしれません。とにかくログインシェルはそれを読む必要があります.profile
。
したがって、最終推奨事項は次のとおりです。
if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
exec /bin/bash --login
fi
最初から溝に入り、.profile
何が起こるかを確認してください。理想的には、ログインシェルがすでにbashの場合は違いはありませんが、他のすべてのシェルはユーザーに通知せずにbashで透明にオーバーライドする必要があります。