Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将“ps-a-u user-F”的输出赋值给SHELL变量_Bash_Shell - Fatal编程技术网

Bash 将“ps-a-u user-F”的输出赋值给SHELL变量

Bash 将“ps-a-u user-F”的输出赋值给SHELL变量,bash,shell,Bash,Shell,我正在尝试捕获正在运行的VNC会话。所以我使用如下 STAT = `ps -a -u user -F | grep "Xvnc :" | grep -v grep` 如果VNC会话正在运行,那么命令ps-a-u user-F的输出是多行的。然后将所有行分配给STAT。我只对一行感兴趣,因为我想要的是为用户运行的VNC的所有会话号。我尝试了下面的命令,使用@作为分隔符而不是\n来解析STAT。它似乎不起作用 STAT = `ps -a -u user -F | grep "Xvn

我正在尝试捕获正在运行的VNC会话。所以我使用如下

    STAT = `ps -a -u user -F | grep "Xvnc :" | grep -v grep`
如果VNC会话正在运行,那么命令ps-a-u user-F的输出是多行的。然后将所有行分配给STAT。我只对一行感兴趣,因为我想要的是为用户运行的VNC的所有会话号。我尝试了下面的命令,使用@作为分隔符而不是\n来解析STAT。它似乎不起作用

    STAT = `ps -a -u user -F | grep "Xvnc :" | grep -v grep | tr -s "\n" "@"
我只需要抓取VNC会话号。感谢您的建议。

如果您的ps版本支持它,您最好重新格式化它的输出,使其更易于解析。在我的系统上,我可以执行以下操作:

$ ps -o command= -C Xvnc
Xvnc :1

$ ps_output="$(ps -o command= -C Xvnc)"

$ vnc_display="${ps_output#Xvnc :}"

$ echo $vnc_display
1
当然,这种方法有一些局限性。它不会选择特定的用户,如果您使用其他命令行选项来Xnc,或者如果您有多个会话正在运行,它将不起作用。因此,您可能希望执行以下操作:

$ grep -z "^:" "/proc/$(pgrep -u user Xvnc)/cmdline"
:1
使用命令替换设置为参数,然后如果需要,可以删除冒号。如果一个用户正在运行多个VNC会话,这仍然不起作用。您必须迭代$pgrep-u用户Xvnc的结果。如果您不关心解析良好的输出,因为人类正在处理结果,那么您可以始终这样做:

$ ps $(pgrep -u user Xvnc)
  PID TTY      STAT   TIME COMMAND
 3600 pts/2    S      0:00 Xvnc :2
 3606 pts/2    S      0:00 Xvnc :3
其工作方式是运行pgrep命令,在本例中,该命令将搜索满足指定条件的进程,该进程以用户用户和命令名Xvnc运行。以下是它的输出结果:

$ pgrep -u user Xvnc 
3600
3606
将其编码为$,并使用壳牌公司的命令替代设施。这将获取命令的输出并将其替换为命令行的一部分。有关详细信息,请运行info bash命令替换。当您运行ps$pgrep-u user Xvnc时,它会导致shell将其解释为:

$ ps 3600 3606
这将产生相同的输出。如果使用set-x调试选项,您可以确切地看到Bash在做什么:

$ set -x
$ ps $(pgrep -u user Xvnc)
++ pgrep -u user Xvnc
+ ps 3600 3606
  PID TTY      STAT   TIME COMMAND
 3600 pts/2    S      0:00 Xvnc :2
 3606 pts/2    S      0:00 Xvnc :3

要处理会话编号列表,请执行以下操作:

$ for snumber in $(ps -a -u USERNAME -F | grep -o -P '[X]vnc :\d+' | awk -F':' '{ print $2 }'); do echo Session ${snumber}; done
Session 2
Session 1
$ 
要在一个变量中包含会话号列表,请执行以下操作:

LIST=$(ps -a -u USERNAME -F | grep -o -P '[X]vnc :\d+' | awk -F':' '{ print $2 }' | tr '\n' ' ' | sed 's; $;;')

如果您只需要X显示数字,例如:1,:2,您可以尝试:

  STAT=`ps -a -u ${USER} -F | \
     perl -ne '$\=" ";if (/^.{64,}Xvnc.*?:([0-9]+)/){print $1}'
在深奥的条件下,这可能会更安全一些,因为它在查找Xvnc之前跳过ps输出的前64列,并且regexp非常复杂,无法匹配自身。这将加载带有空格分隔的X显示ID列表的$STAT,例如2 4 6或类似,适用于$STAT中的n;do echo$用户处于打开状态:$n;完成

突发事件:

   $\=" ";       # print a space after every print command
   if (/^        # start of line (matches the input line 
        .{64,}   # at least 64 characters
        Xvnc     # the bit you wanted
        .*?      # any other spaces or parameters that might be around
        :        # find a colon
        (\d+)    # find, and keep, at least one digit
        /x)      # (the /x only so I can put comments into the regex here)
   { print $1 }  # print the digits that we found in () group 1

perl-ne设置了一个自动while{}循环来读取输入

请显示第一个命令的示例输出以及所需的输出?X显示数字?非常好,这会进入我的工具箱。太棒了。我可以有一些解释abt ps$pgrep-u用户XvncSure,额外的解释补充。伟大的答案。修改了一下,因为我只对第8节课感兴趣。将上述命令修改为-ps-a-u cad-F | grep-o-P Xvnc:\d+| grep Xvnc:8-我得到一个错误,表示grep没有这样的文件或目录,Xvnc没有这样的文件或目录,并且Xvnc没有这样的文件或目录。grep输出与模式Xvnc:\d+=>Xvnc后跟:后跟至少一个数字匹配的字符串部分。将它传输到“grep”以从N个Xvnc会话中查找特定数字是什么错误?@Mike:这不是错误,但可能是在您更改之后。我要说的是读曼·格雷普: