내 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
. PID dash
와 그 안의 모든 것은 에 의해 인계됩니다 bash
. 새로 bash
스크립트를 다시 실행합니다(이번에는 끝에 도달함).
.profile
bash에 매개변수로 전달되지 않고 초기화 중에 실행된 것으로 기억합니다 (소스). 구체적인 상황을 주의 깊게 확인해야 합니다. 어쩌면 실제로 강제로 실행하고 exec /bin/bash --login
명령줄을 읽는 번거로움을 피하는 것이 더 나을 수도 있습니다 . 어쨌든 로그인 쉘은 이를 읽어야 합니다 .profile
.
따라서 최종 권장 사항은 다음과 같습니다.
if [ ! $(basename $(readlink -f $cmd)) = 'bash' ]; then
exec /bin/bash --login
fi
처음부터 그루브에 들어가서 .profile
무슨 일이 일어나는지 확인하십시오. 이상적으로는 로그인 셸이 이미 bash인 경우 아무런 차이가 없지만 다른 모든 셸은 사용자에게 알림을 주지 않고 bash로 투명하게 재정의되어야 합니다.