我写了一个 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