鱼壳-嵌套引号内插

问题描述

我试图编写一个fish函数来在长命令完成运行后显示通知。我可以使用它,但是我想知道是否有更好的方法来使插值与嵌套引号一起使用。

function record_runtime --on-event fish_postexec
    set text \"$argv took $CMD_DURATION\"
    set command "display notification $text"
    if [ $CMD_DURATION -gt 60000 ]
        osascript -e "$command"
    end
end

我希望有一个osascript -e 'display notification "$argv took $CMD_DURATION"'这样的班轮,但找不到有效的组合。

解决方法

因此,您要做的是使用一个参数执行osascript,该参数包含命令“ display notification”和$ argv的 value ,单词“ took”和$ CMD_DURATION的值。这意味着您希望鱼扩展这些变量。

重要的是,fish不会以单引号('')扩展变量,这就是您其他尝试失败的原因。变量只能用双引号或完全用引号引起来。

现在我没有要测试的macOS机器,但是如果osascript也允许单引号,则很简单:

function record_runtime --on-event fish_postexec
    if [ $CMD_DURATION -gt 60000 ]
        osascript -e "display notification '$argv took $CMD_DURATION'"
    end
end

双引号中的单引号没有特殊含义,因此$argv$CMD_DURATION被扩展。

如果osascript在这里需要双引号,则必须转义内部的双引号:

function record_runtime --on-event fish_postexec
    if [ $CMD_DURATION -gt 60000 ]
        osascript -e "display notification \"$argv took $CMD_DURATION\""
    end
end