如何解决ps -ef | {head -n 1;排序;意外的输出
为什么以下内容在第二行中切出root
一词并歪斜输出,而不是与随后的所有行统一?
# ps -ef | { head -n 1 ; sort ; } | head -n11
UID PID PPID C STIME TTY TIME CMD
470 2 0 Oct07 ? 00:00:00 [xfsaild/nvme4n1]
apache 10210 5801 0 Oct12 ? 00:04:04 /var/site/fastcgi.pl
apache 10211 5801 0 Oct12 ? 00:03:11 /var/site/fastcgi.pl
apache 10212 5801 0 Oct12 ? 00:03:35 /var/site/fastcgi.pl
apache 10265 5801 0 Oct12 ? 00:03:55 /var/site/fastcgi.pl
apache 10325 5801 0 Oct12 ? 00:03:50 /var/site/fastcgi.pl
apache 10328 5801 0 Oct12 ? 00:03:39 /var/site/fastcgi.pl
apache 10329 5801 0 Oct12 ? 00:02:59 /var/site/fastcgi.pl
apache 10330 5801 0 Oct12 ? 00:03:50 /var/site/fastcgi.pl
apache 11889 3815 0 Oct08 ? 00:33:11 /usr/sbin/httpd -k start
我希望输出能打印出来
# ps -ef | { head -n 1 ; sort ; } | head -n2
UID PID PPID C STIME TTY TIME CMD
root 470 2 0 Oct07 ? 00:00:00 [xfsaild/nvme4n1]
这似乎是比赛条件。有时当我运行它时,它不会发生。
$ ps -ef | { head -n 1 ; sort ; } | head -n3
UID PID PPID C STIME TTY TIME CMD
avahi 1328 1 0 Oct12 ? 00:00:08 avahi-daemon: running [danied.local]
avahi 1401 1328 0 Oct12 ? 00:00:00 avahi-daemon: chroot helper
解决方法
您的命令受竞争条件的影响,更具体地说,head -n1
可以在第二条命令设法获得任何输入之前关闭后面的管道(如果第一条命令也已结束)。
考虑以下示例:
> cat test.sh
for ((i=1;i<=3; i++)); do
printf "$i\n"
# sleep 1
done
如果运行多次,您将获得不同的结果
> sh test.sh | { head -n1; tail -n +1; }
1
> sh test.sh | { head -n1; tail -n +1; }
1
2
3
如果取消注释sleep 1
语句到循环中,则两个命令都将得到输入。因为不会立即从第一个命令关闭管道,所以第二个部分将等待确定,尽管第一个head
已完成。
当我启动此命令时,这就是我得到的:
Prompt> ps -ef | { head -n 1 ; sort ; } | head -n11
UID PID PPID C STIME TTY TIME CMD
Prompt> uname -a
Linux ...-Microsoft #488-Microsoft Mon Sep 01 13:43:00 ... GNU/Linux
这更有意义:ps -ef
显示所有正在运行的进程,head -n 1
仅显示第一行,其余都不重要。
您可以再次运行该命令,看看一切都与您所说的一样,然后运行uname -a
命令,以验证您正在使用哪种类型的计算机吗? (env | grep -i "shell"
的结果也可能有用)。只需相应地编辑您的问题即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。