为什么我的 shell 脚本只能在“显示输出”执行模式下执行?

为什么我的 shell 脚本只能在“显示输出”执行模式下执行?

我写了一个 bash 脚本(这里) 用于从图像中提取 EXIF GPS 坐标,并在 Google 地图中将这些坐标显示为指针。在终端中这样使用时,效果很好:

GUI=1 ./show_location_in_chrome.sh /path/to/image.jpg

我使用 Nautilus-Actions 向 Nautilus 添加了右键单击命令,其设置如下:

           路径:GUI=1 /home/tomas/show_location_in_chrome.sh
     参数:%f
基本名称过滤器:*.jpg

但是当我右键单击 JPEG 文件并单击菜单项时,什么也没有发生。唯一的例外是当“执行模式”设置为“显示输出”时,在这种情况下脚本按预期工作。不幸的是,Nautilus 还会显示一个带有脚本输出的大窗口,我每次都必须手动关闭它。

我如何弄清楚为什么脚本在“显示输出”以外的任何其他执行模式下都不起作用?如果我可以提供更多具体信息,请发表评论。

命令输出中显示的“运行命令”为:

/bin/sh -c 'GUI=1 /home/tomas/show_location_in_chrome.sh '\''/home/tomas/Dropbox/Camera Up
加载/2013-07-21 14.58.33.jpg'\'''

编辑#!/usr/bin/env bash:我已在脚本顶部添加了bash“路径”设置中的显式调用,并删除了该调用。但没有任何改变。


编辑:我将其添加echo "Works" > ~/test.txt到脚本顶部(shebang 下方),然后单击菜单项。我的主文件夹中没有添加任何文件,因此我得出结论,即使执行模式不是“显示输出”,脚本也不会被执行。

答案1

可能,如果关闭“显示输出”,它可能不会在 shell 中运行该命令,因此语法GUI=1不会被解析为赋值。如果是这种情况,将命令更改为以下内容应该有效:

/usr/bin/env GUI=1 /home/tomas/show_location_in_chrome.sh

另外,您可能不需要该 GUI 变量,您可以使用已有的变量来确定是否使用 zenity。例如,只有在图形登录时才应设置 DISPLAY 变量,因此更改[ "$GUI" ][ "$DISPLAY" ](或更好的, [[ $DISPLAY ]]) 应该可以正常工作。

如果您只想在不从终端运行时使用 zenity,则可以使用测试来测试终端-t。例如

if [[ ! -t 1 && $DISPLAY ]]; then   # if fd 1 (stdout) is not connected to a terminal, and DISPLAY is non-empty
    zenity ...
else
    echo ...
fi

编辑:或者,添加一个选项来指定“是否为 gui”。

gui=0
while [[ $1 = -* ]]; do
    case $1 in
        -h|--help) echo "usage..."; exit ;;
        -g|--gui) gui=1 ;;
         *) echo >&2 "invalid option: $1"; exit 1 ;;
    esac
    shift
done

#...

if (( gui )); then
    zenity ...
else
    echo ...
fi

相关内容