이 스크립트가 있습니다. ~/Desktop에 넣었습니다. 데스크탑의 폴더 보기 위젯에서 스크립트를 봅니다. 스크립트를 클릭하면 사용자 목록이 표시되고 인증 대화 상자(비밀번호)가 표시되며 동일한 가상 데스크탑에 표시하려는 "konsole"이 표시됩니다.
불행히도 임의의 가상 데스크탑에 나타납니다. VD의 "프로토콜" 중 X가 얼마나 되고 KDE가 얼마나 되는지 모르기 때문에 문제가 어디에 있는지 알 수 없습니다. 이 동작의 원인은 무엇입니까? 활성 VD에 나타나도록 이 동작을 수정하려면 어떻게 해야 합니까?
나는 프리노드 IRC 채널 #linux에서 이 질문을 시도했는데, 그곳에서 Psi_Jack이라는 별명을 가진 사람이 이 스크립트에 대해 나에게 많은 슬픔을 안겨주었습니다. 주로 내가 bash에서 Ruby를 호출했기 때문입니다. 문제는 "saned", "mysqld", "fethmail" 등과 같은 "mom", "pop", "sis", "mouse"와 같은 "실제" 사용자에게만 액세스하고 싶다는 것입니다. 그래서 사용자 ID를 테스트해야 합니다. Bash는 그다지 어렵지는 않지만 내가 좋아하는 것보다 더 혼란스럽습니다. 이러한 경우에 나는 Ruby를 사용합니다. 왜냐하면 Ruby는 부분적으로 Perl의 복잡한 부분을 정리하기 위해 존재하고 Perls는 부분적으로 다양한 스크립트 쉘의 복잡한 부분을 정리하기 위해 존재하기 때문입니다.
문제는 Ruby가 정확하다는 것을 알고 있고 AFAICS에서는 "/usr/lib/kde4/libexec/kdesu -u $KA_USER konsole" 행 이외의 스크립트에는 실제 문제가 없다는 것입니다. 그러니 스크립트를 따로 보관하세요.
#!/usr/bin/env sh
# kstart --desktop [#] [command]
# Assign to dlg the specified user.
dlg=$(ruby <<EOF
command = "zenity --list --column=User root"
File.new("/etc/passwd").readlines.each{|l|
fields=l.split(":")
if ( fields[2].to_i > 1000 and fields[2].to_i<60000) then
command = command+" #{fields[0]}"
end
}
puts command
EOF
)
# Execute zenity dialog, assign choice to KA_USER
KA_USER=$($dlg)
if [ -n "$KA_USER" ]
then
t=$(mktemp --suffix=log /tmp/sukon-XXXX)
/usr/lib/kde4/libexec/kdesu -u $KA_USER konsole
fi