首页 > 解决方案 > 大括号扩展作为标志参数对

问题描述

我正在尝试top结合使用pgrep来过滤正在显示的进程。到目前为止我的工作是:

top -pid (pgrep dart)

top这对于在的交互式视图中显示单个进程非常有用。

但是,macos 版本top只有一种列出多个进程的方式,您必须一遍-pid [process id]又一遍地重复,例如:

top -pid 354 -pid 236 -pid 287

我的第一个想法是我可以使用大括号扩展和命令替换来实现这一点,我尝试了:

top "-pid "{(pgrep dart)}

但我明白了invalid option or syntax: -pid {33978}。即使我手动添加 pids 它也不起作用:

top "-pid "{45, 23}

invalid option or syntax: -pid 45

是否有可能实现我想要用鱼做的事情?即通过命令替换和大括号扩展的组合将标志插入命令?

标签: fish

解决方案


我想我们可以想出一些更简洁的东西,但至少:

top (string split " " (printf " -p %s" (pgrep dart)))

fish作为第一次尝试,似乎在 Ubuntu/WSL 上对我有用。这应该转化为:

top (string split " " (printf " -pid %s" (pgrep dart)))

在 MacOS 上,但从评论来看,听起来 -pid可能会被传递给printf(first),然后string split是 ,当然两者都不喜欢。在 WSL/Ubuntu 上,我遇到了这个问题,但能够通过在字符串开头添加空格来解决它。但是,这似乎不适用于 Mac。您的解决方案确实是更规范的解决方案;用于--阻止这些命令-pid按预期解释它们。

因此,top (string split -n " " -- (printf -- "-pid %s " (pgrep dart)))适用于 MacOS top,Linux/Ubuntu 所需的唯一更改是将 替换为-pid-ptop (string split -n " " -- (printf -- "-p %s " (pgrep dart))).

哪个有效,但非常冗长。为了简化,你想出了:

top (string split " " -- "-pid "(pgrep dart)) # MacOS
top (string split " " -- "-p "(pgrep dart)) # Linux

杰出的!老实说,我从未在 中使用过笛卡尔fish,但这显然是您在尝试进行大括号扩展时首先要做的。

使用该示例,我能够将其改进(至少在 Linux 上):

top "-p "(pgrep dart)

但我有一种感觉,等效的东西top "-pid "(pgrep dart)在 MacOS 上不起作用,因为top "-pid "{45, 23}对你也不起作用。top "-p "{1,11}出于某种原因,同样的构造 ( ) 对我有用。


推荐阅读