MacUser的一位编辑在某天使用Leopard的终端的时候,发现他熟悉的ps -aux命令居然不能得到他预期的结果!错误提示是诡异的“No user named 'x' ”!熟悉UNIX/Linux的读者一定已经在给我提示了,“去掉短横线试试呢?”没错!去掉短横之后,这条命令“ps aux”就能正确运行了!
不熟悉命令行的读者一定已经开始犯迷糊了,什么“ps aux”啊?好吧,我来解释一下。“ps”是一条查看系统进程的命令,相当于Windows XP下的“tasklist”命令,可以通过指定不同的参数查看符合参数指定的条件的进程信息。“ps aux”就是带上了“aux”参数的“ps”命令,能列出系统中所有用户的所有进程。“aux”实际上是三个参数:a, u, x,想了解a, u, x分别指什么的读者可以阅读“ps”的帮助文档。
有“-”和没有“-”的参数之间又有什么区别呢?在为命令指定参数的时候,使用“-”的参数通常被称为UNIX风格的参数,而不用“-”的参数,则被称为BSD风格的参数。一个很要命的问题就是“ps”同时包含UNIX风格的参数和BSD风格的参数——没错,ps不仅有a, u, x参数,还有-a, -u参数(注意,没有-x参数),而两者的意思是完全不同的。因为Mac OS X是符合UNIX 03认证的正宗的UNIX,因此,将"ps aux"不小心误用为"ps -aux"的时候,实际上命令也就成了“ps -a -u x”,这条命令的意思大致是,列出所有属于用户‘x’的进程。在Mac OS X中,如果系统中不存在用户名为‘x’的用户(基本上没有人会新建一个名字为x的用户帐户吧),系统就会直接报错,提示不存在用户‘x’,这也就是上面这位MacUser的编辑遇到的问题。
通常,在Linux下,在用户将"ps aux"误用为"ps -aux"的时候,如果没有名为‘x’的用户,则系统会直接把“ps -aux”解释为“ps aux”,但是会在输出“ps aux”的命令运行结果之前会打印一条警告信息(上图)。
很明显,Mac OS X和Linux对待“ps -aux”的态度不一样。尽管Mac OS X这样做对用户有点不友好,但是这个确实UNIX 03认证的要求。
深入阅读:
1. UNIX和Linux的历史:UNIX年表
2. Mac OS的历史:A Technical History of Apple's Operating Systems (PDF下载)
3. ps的man文档(来自Linux):http://www.rt.com/man/ps.1.html
4. Apple官方文档:UNIX 03 Conformance Release Notes