Fish shell - 嵌套引号中的插值

Fish shell - Interpolation in nested quotes

我正在尝试编写一个 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,该参数包含命令“显示通知”和 $argv 的 ,单词"take" 和 $CMD_DURATION 的值。这意味着您希望 fish 展开 这些变量。

重要的是,fish 不会扩展 single-quotes ('') 中的变量,这就是您的其他尝试失败的原因。变量仅在 double-quotes 内或完全在引号外展开。

现在我没有macOS机器测试,但是如果osascript也允许单引号,这个就简单了:

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

double-quotes里面的single-quotes没有特殊意义,所以把$argv$CMD_DURATION展开了。

这里如果osascript需要double-quotes,就得转义里面的double-quotes:

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