Ubuntu 14.04 子 shell 和自定义键盘快捷键中的变量扩展?

Blu*_*ber 3 gnome shortcut-keys

如何在 14.04 中通过自定义键盘快捷键启用 bash 扩展?这是我一直在尝试设置的一个示例;我想执行这个确切的命令(该命令在运行 bash 的终端上运行):

gnome-screenshot --window --remove-border -f ~/Pictures/screenshot_$(date +%x_%H:%M:%S:%N).png
Run Code Online (Sandbox Code Playgroud)

它不能按原样工作,也不能:

gnome-screenshot --window --remove-border -f $HOME/Pictures/screenshot_$(date +%x_%H:%M:%S:%N).png
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为以下内容:

gnome-screenshot --window --remove-border -f "/home/user/Pictures/screenshot_$(date +%x_%H:%M:%S:%N).png"
Run Code Online (Sandbox Code Playgroud)

我最终在桌面上看到一个名为“screenshot_$(date +%x_%H:%M:%S:%N).png”的文件(无子外壳扩展)。我究竟做错了什么?如果不是 bash,什么执行这些命令?为什么子 shell 或变量/波形符没有展开?

Glu*_*ate 5

Unity 中的键盘快捷键字段的工作方式与.desktop文件类似,即在没有任何形式的子 shell 或变量扩展的情况下执行命令,并且无法访问任何环境变量。

我无法找到有关键盘快捷键菜单的官方规范,但我认为假设命令执行遵循与XDG 文件中的Exec 字段.desktop类似的准则是可以避免的。

实际上,这意味着有两种方法可以使自定义命令行与快捷菜单一起使用:

  1. 将命令转换为简单的 shell 脚本,并将键盘快捷键指向 shell 脚本。

    例如,您可以将以下内容粘贴到新的文本文件中,将其命名为类似的名称custom_screenshot_script并使脚本可执行:

    #!/bin/bash
    gnome-screenshot --window --remove-border -f "~/Pictures/screenshot_$(date +%x_%H:%M:%S:%N).png"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 调用bash以执行您的命令。

    这比较棘手,因为你必须正确地转义你的论点。像下面这样的东西应该有效:

    bash -c "gnome-screenshot --window --remove-border -f \"~/Pictures/screenshot_$(date +%x_%H:%M:%S:%N).png\""
    
    Run Code Online (Sandbox Code Playgroud)