如何获取 Linux 中已运行进程的命名选项的值?

Ton*_*ark 4 bash process shell-script arguments

我运行以下命令。

ps -e -o args | grep destiny | grep UNIX
Run Code Online (Sandbox Code Playgroud)

我收到以下输出。

/path/to/destiny -r -m UNIX -t TCP -p 1501
Run Code Online (Sandbox Code Playgroud)

我可以使用什么命令来获取打印参数的值(例如-mor-t-p)?我想实现以下目标。

ps -e -o args | grep destiny | grep UNIX | <someCommand> -p 这应该打印 1501

ps -e -o args | grep destiny | grep UNIX | <someCommand> -m 这应该打印 UNIX

ps -e -o args | grep destiny | grep UNIX | <someCommand> -t 这应该打印 TCP

请注意-p-m-t可能会切换列,因此awk不能选择按数字列打印和选择列。

更多的事实使解析变得更容易(我知道我可能只是缺乏工具知识)。

  • 如果选项不存在,将返回一个空字符串
  • 在这种特殊情况下,将被解析的选项将始终具有参数/值

Cel*_*ada 5

这通常是不可能的,因为只有命令本身知道如何解析自己的参数。以你的例子为例:

/path/to/destiny -r -m UNIX -t TCP -p 1501
Run Code Online (Sandbox Code Playgroud)

-p可能是一个不带参数的选项(如布尔值:它启用或禁用某些行为)在这种情况下1501将是一个位置参数(如文件名或其他东西)。或者-p可以是一个带有参数的选项,它的参数是1501. 没有办法知道它是哪个!

参数向量只是零个或多个字符串的列表。这些字符串没有任何意义,表明哪些是选项,哪些是这些选项的参数,哪些是非选项参数。

即使-r您的示例中的选项也无法确定地进行一般解析。鉴于-r紧随其后的是另一个以 开头的字符串,-很有可能这-r是一个不带参数的选项(例如启用或禁用某些行为的布尔值),但实际上这不是 100% 确定的。-r可能是一个带有参数的选项,并且-m将是它的参数。或者该命令可能根本不遵循正常的 UNIX 约定,-r根本不是一个选项!