我正在做一些涉及屏幕的脚本,看起来screen -ls
总是返回 1. 这正常吗?
屏幕手册页说,如果通过,它会做有趣的事情screen -ls -q
,但我没有这样做(可能也值得注意,这-q
似乎不起作用)。
好吧,现在我真的使困惑。我正在查看 gnu 屏幕源:
if (lsflag) {
int i, fo, oth;
if (multi)
real_uid = multi_uid;
SET_GUID();
i = FindSocket((int *)NULL, &fo, &oth, SocketMatch);
if (quietflag) {
if (rflag)
exit(10 + i);
else
exit(9 + (fo || oth ? 1 : 0) + fo);
}
if (fo == 0)
Panic(0, "No Sockets found in %s.\n", SocketPath);
Msg(0, "%d Socket%s in %s.", fo, fo > 1 ? "s" : "", SocketPath);
eexit(0);
}
lsflag
-l
如果您发出or-ls
命令,则设置eexit
为:
void eexit(int e)
{
if (ServerSocket != -1) {
if (setgid(real_gid))
AddStr("Failed to set gid\r\n");
if (setuid(real_uid))
AddStr("Failed to set uid\r\n");
if (unlink(SocketPath))
AddStr("Failed to remove socket\r\n");
}
exit(e);
}
甚至不应该screen -ls
返回 1。
答案1
对源头的进一步挖掘得出了答案。与往常一样,这是因为 Debian 正在发布核心组件的旧版本。
if (lsflag)
{
int i, fo, oth;
#ifdef MULTIUSER
if (multi)
real_uid = multi_uid;
#endif
SET_GUID();
i = FindSocket((int *)NULL, &fo, &oth, SockMatch);
if (quietflag) {
if (rflag)
exit(10 + i);
else
exit(9 + (fo || oth ? 1 : 0) + fo);
}
if (fo == 0)
Panic(0, "No Sockets found in %s.\n", SockPath);
Panic(0, "%d Socket%s in %s.\n", fo, fo > 1 ? "s" : "", SockPath);
/* NOTREACHED */
}
其中 Panic 如下
void Panic (int err, const char *fmt, VA_DOTS)
{
char buf[MAXPATHLEN*2];
PROCESS_MESSAGE(buf);
debug3("Panic('%s'); display=%x displays=%x\n", buf, display, displays);
if (displays == 0 && display == 0)
{
printf("%s\r\n", buf);
if (PanicPid)
Kill(PanicPid, SIG_BYE);
}
else if (displays == 0)
{
/* no displays but a display - must have forked.
* send message to backend!
*/
char *tty = D_usertty;
display = 0;
SendErrorMsg(tty, buf);
sleep(2);
_exit(1);
}
else
for (display = displays; display; display = display->d_next)
{
if (D_status)
RemoveStatus();
FinitTerm();
Flush(3);
#ifdef UTMPOK
RestoreLoginSlot();
#endif
SetTTY(D_userfd, &D_OldMode);
fcntl(D_userfd, F_SETFL, 0);
write(D_userfd, buf, strlen(buf));
write(D_userfd, "\n", 1);
freetty();
if (D_userpid)
Kill(D_userpid, SIG_BYE);
}
#ifdef MULTIUSER
if (tty_oldmode >= 0)
{
# ifdef USE_SETEUID
if (setuid(own_uid))
xseteuid(own_uid); /* may be a loop. sigh. */
# else
setuid(own_uid);
# endif
debug1("Panic: changing back modes from %s\n", attach_tty);
chmod(attach_tty, tty_oldmode);
}
#endif
eexit(1);
}
至于为什么Panic()
不返回通过成员传递给它的错误代码err
,你的猜测和我的一样好。-Q
尽管存在,但似乎这个论点也被打破了。
基本上,版本apt
已损坏。