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. PID dash와 그 안의 모든 것은 에 의해 인계됩니다 bash. 새로 bash스크립트를 다시 실행합니다(이번에는 끝에 도달함).

.profilebash에 매개변수로 전달되지 않고 초기화 중에 실행된 것으로 기억합니다 (소스). 구체적인 상황을 주의 깊게 확인해야 합니다. 어쩌면 실제로 강제로 실행하고 exec /bin/bash --login명령줄을 읽는 번거로움을 피하는 것이 더 나을 수도 있습니다 . 어쨌든 로그인 쉘은 이를 읽어야 합니다 .profile.

따라서 최종 권장 사항은 다음과 같습니다.

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

처음부터 그루브에 들어가서 .profile무슨 일이 일어나는지 확인하십시오. 이상적으로는 로그인 셸이 이미 bash인 경우 아무런 차이가 없지만 다른 모든 셸은 사용자에게 알림을 주지 않고 bash로 투명하게 재정의되어야 합니다.

관련 정보