鱼壳命令替换在监视命令中



我正在尝试使用鱼壳中的监视命令。

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

如您所见,鱼的这种有效的命令替换语法。 但是当我运行它时,我在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)"

有没有办法解决这个问题?

简而言之:

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

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

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

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

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

watch将使用sh来执行shell命令。您可以对字符串使用单引号,以防止fish对用于不同 shell 的数据感到恐慌。

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

最新更新