首页 > 解决方案 > watch 命令中的 fish shell 命令替换

问题描述

我正在尝试在鱼壳中使用 watch 命令。

sudo watch -d "lsof -a -p (pidof myprogram)"

如您所见,fish 的这个有效命令替换语法。watch但是,当我运行它时出现以下错误。

sh: -c: line 0: syntax error near unexpected token '('
sh: -c: line 0: `lsof -a -p (pidof myprogram)'

如果我将命令更改为 sh 兼容语法

sudo watch -d "lsof -a -p $(pidof myprogram)"

我收到以下错误。

$(...) is not supported. In fish, please use '(pidof)'.                                                                                                                        
fish: sudo watch -d "lsof -a -p $(pidof myprogram)"

有没有解决的办法?

标签: shellterminalfish

解决方案


简而言之:

sudo watch -d "lsof -a -p "(pidof myprogram)

即退出引号并执行命令替换(中间没有空格,因此将直接附加)。

这里有一点差距,因为您希望命令的输出根本不被拆分 - 这里它将在换行符上拆分它,并制作多个标记,如"lsof -a -p "line1 "lsof -a -p"line2. 在这种情况下,这不应该是一个问题,但如果你想要它,你应该使用string split0like

 sudo watch -d "lsof -a -p "(pidof myprogram | string split0)

只会拆分 NULL 字节,命令行参数中不允许使用这些字节(这是通用的 unix 事物 - 因为参数main作为 NULL 分隔的字符串传递,没有任何其他长度指示,如果它们包含 NULL,它们将被截断)。


推荐阅读