Fish shell - 嵌套引号中的插值

标签 fish

我正在尝试编写一个 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 take $CMD_DURATION"' 这样的单行代码,但找不到有效的组合。

最佳答案

所以,你要做的就是执行osascript带有一个参数,其中包含命令“显示通知”和 $argv 的、单词“took”以及 $CMD_DURATION 的值。这意味着您希望 fish 扩展这些变量。

重要的是,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

关于Fish shell - 嵌套引号中的插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63949266/

相关文章:

virtualenv - Pyenv activate 不运行带 fish shell 的激活脚本

fish shell 中的重复字符

Git 别名,用于与 master 的最新版本重新 merge

fish - 如何为命名函数参数设置默认值?

wildcard - 如何在 fish shell 中为点文件和文件夹使用递归通配符?

node.js - fish shell nvm 告诉我 node 和 npm 是 "currently not installed"但它们是

使用带有 rbenv 的 fish shell 找不到 bundle 程序

macos - 如何在 Mac 上设置默认 shell,例如 fish ?

linux - fish 中的配置

interpolation - Fish shell - 如何插入子命令?