ps-ef | { 头 -n 1 ;种类 ;意外的输出
ps -ef | { head -n 1 ; sort ; } Unexpected output
为什么下面把第二行的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
当我启动这个命令时,这是我得到的:
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
显示所有运行ning进程,head -n 1
只显示第一行,其余不重要。
你能不能再次运行那个命令,看看一切都像你说的那样,运行uname -a
命令,以验证你正在使用哪种类型的机器和? (env | grep -i "shell"
的结果也可能有用)。只需相应地编辑您的问题。
您的命令受制于竞争条件,更具体地说,如果第一个命令也已结束,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
已完成。
为什么下面把第二行的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
当我启动这个命令时,这是我得到的:
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
显示所有运行ning进程,head -n 1
只显示第一行,其余不重要。
你能不能再次运行那个命令,看看一切都像你说的那样,运行uname -a
命令,以验证你正在使用哪种类型的机器和? (env | grep -i "shell"
的结果也可能有用)。只需相应地编辑您的问题。
您的命令受制于竞争条件,更具体地说,如果第一个命令也已结束,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
已完成。