Почему мой сценарий оболочки выполняется только в режиме выполнения & ldquo; Показать вывод & rdquo ;?

Я написал скрипт bash ( здесь ) для извлечения GPS-координат EXIF ​​из изображения и отображения этих координат в виде указателя в Google Maps. Он отлично работает, когда используется в терминале следующим образом:

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

Я добавил команду Nautilus правой кнопкой мыши, используя Nautilus-Actions со следующими настройками:

           Path: GUI=1 /home/tomas/show_location_in_chrome.sh
     Parameters: %f
Basename filter: *.jpg

Но когда я щелкните правой кнопкой мыши файл JPEG и выберите пункт меню, ничего не происходит. Единственное исключение - когда «Режим выполнения» установлен на «Отображать вывод», и в этом случае сценарий работает так, как задумано. К сожалению, Наутилус также отображает большое окно с выводом скрипта, которое мне приходится каждый раз закрывать вручную.

Как выяснить, почему скрипт не работает ни в каком другом режиме выполнения, кроме «Вывод на экран»? Пожалуйста, прокомментируйте, если я могу предоставить более конкретную информацию.

«Команда выполнения», отображаемая в выходных данных команды:

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

Редактировать : я добавил #!/usr/bin/env bash в начало моего сценария и удалил явный вызов bash в настройке «Путь». Это ничего не изменило.


Редактировать : я добавил echo "Works" > ~/test.txt в верхнюю часть скрипта (под шебанг), затем щелкнул пункт меню. Файлы не были добавлены в мою домашнюю папку, поэтому я пришел к выводу, что сценарий даже не выполняется, когда режим выполнения отличается от «Вывод на экран».

0
задан 26 July 2013 в 05:05

1 ответ

Возможно, с отключенным «выводом на экран», он, вероятно, не запускает команду в оболочке, поэтому синтаксис 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
0
ответ дан 26 July 2013 в 05:05

Другие вопросы по тегам:

Похожие вопросы: