有什么ps –ax | grep $$ > catch
作用?我想知道这一行执行什么。当我运行代码时,它不会在输出中添加任何内容。
答案1
该命令ps -ax
显示您以及其他用户的进程。
grep
匹配与正则表达式匹配的行。在本例中,正则表达式为 $$
,shell 将其扩展为当前 shell 的进程 ID。
右尖括号 ( >
) 将输出重定向到名为catch
.如果文件存在,则首先将其截断(清空),否则将创建该文件。
答案2
这不是一个好的做事方式。你要求 ps 显示:
- 您的所有进程(默认)
- plus - 所有其他有 tty 的进程(一个选项)
- plus - 所有其他没有 tty 的进程(x 选项)
grep
然后 - 使用步骤 1 中的单个进程进行过滤
简单的事情ps -h $$ > catch
就可能做到。ps
将您感兴趣的进程的 PID 作为命令行选项,因此如果您知道自己想要什么,请直接指定它,而不是希望 grep 能够工作。该-h
选项是删除标题行。
但是,您必须非常小心脚本中的 $$,因为它的意思是“这个 shell”,但它的概念这取决于调用的时间和地点。
考虑这两个命令:
$ sh -c "ps -ax | grep $$"
3802 pts/0 Ss 0:11 bash
3658110 pts/0 S+ 0:00 sh -c ps -ax | grep 3802
3658112 pts/0 S+ 0:00 grep 3802
$ sh -c 'ps -ax | grep $$'
3658142 pts/0 S+ 0:00 sh -c ps -ax | grep $$
3658144 pts/0 S+ 0:00 grep 3658142
脚本总是做这种事情,看看第一个有 3 行,但第二个只有 2 行?这是因为第一个我们正在解决,$$
然后运行脚本并找出“主”shell,但第二个我们正在以另一种方式进行,当然它具有不同的子 shell 的 PID 并且与 3802 不匹配父母。
哪一个是正确的?这取决于您想要做什么。如果我正在寻找主 shell,我通常会首先将其设置为一个变量,这样很明显这就是我想要的。