Форум русскоязычного сообщества Ubuntu


Автор Тема: Скрипт для nautilus не работает на Рабочем столе.  (Прочитано 967 раз)

0 Пользователей и 1 Гость просматривают эту тему.

adawdp

  • Автор темы
  • Гость
— Здр.! Все.
— Я совершенно не программист, но скрипт написать хотелось. Я „со словарём :)“ и с посторонней помощью  что-то написал.
Код: (bash) [Выделить]
#!/bin/sh
# Получить данные об изображении…
while [ $# -ne 0 ]
do
identify -verbose $1 $1.* | grep -A 2 Geometry | sed "/size/s/:\s*/&x/" | awk -Fx '! /size/ { print } ; /size/ { CONVFMT = "%.1f mm"; print $1 $2*25.4" x "$3*25.4 } ' | zenity --title="KapTuHKa" --text-info
shift
done
— Если запускать из Nautilus→Сценарии→Имя скрипта даёт такие сведения об изображении.

— Но при запуске просто на рабочем столе появляется только пустое окно zenity без данных.
— Это так и должно быть или что-то где-то можно подправить?
— Если положим выводить данные в буфер обмена, то тоже не работает скрипт на рабочем столе, хотя из nautilus'a работает…
Код: (bash) [Выделить]
#!/bin/sh
# Получить в буфер данные об изображении…
while [ $# -ne 0 ]
do
identify -verbose $1 $1.* | grep -A 2 Geometry | sed "/size/s/:\s*/&x/" | awk -Fx '! /size/ { print } ; /size/ { CONVFMT = "%.1f mm"; print $1 $2*25.4" x "$3*25.4 } ' | xsel -ib
shift
done

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Все верно, Nautilus передает первым аргументом $1 путь к файлу. Попробуйте запустить ваш скрипт через терминал, также передавая путь к файлу, будет аналогичный результат:
./script.sh /path/to/image.jpg

а теперь без определенной картинки, т.е. без аргумента - что вы и называете "при запуске на рабочем столе":
./script.sh

Советую изучить основы:
http://habrahabr.ru/post/47163/
http://habrahabr.ru/post/52871/

Пользователь решил продолжить мысль 18 Июня 2014, 22:58:15:
Некоторое время спустя все же понял что вы вероятно имеете ввиду - что ваш скрипт не работает с директориями, не выводит инфу по находящимся в директории изображниям. В таком случае можно немного модифицировать скрипт:

Код: (bash) [Выделить]
#!/bin/bash
# Получить данные об изображении…

function showImageInfo {
identify -verbose $1 |\
grep -A 2 Geometry |\
sed "/size/s/:\s*/&x/" |\
awk -Fx '! /size/ { print } ; /size/ { CONVFMT = "%.1f mm"; print $1 $2*25.4" x "$3*25.4 } ' |\
zenity --title="KapTuHKa" --text-info

}

while [ $# -ne 0 ]
do
if [ -d "$1" ]; then
for f in $1/*
do
if [ ! -d "$f" ]; then
identify -ping $f && showImageInfo $f
fi
done
else
showImageInfo $1
fi

        shift
done
« Последнее редактирование: 19 Июня 2014, 00:21:47 от .ubuntufan »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
adawdp, в скрипте все спецсимволы (пробел в т.ч.) в путях надо экранировать.
Под путём подразумевается абсолютное или относительное имя файла или каталога.
По хорошему, вообще все переменные в 99% случаев имеет смысл кавычить, на всякий пожарный.
identify -verbose "$1" ...

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Давайте разберемся…
Для нормальной работы скрипту нужно передать аргумент. В Вашем случае в скрипте используется «$1» (правда непонятно почему там есть ещё и «$1.*») — первый переданный скрипту аргумент. Для скриптов Наутилуса это первый элемент выделения. После чего программа должна вывести второй и т.д.
По логике без аргументов вообще он не должен срабатывать — не даст условие [ $# -ne 0 ]. Поэтому если выводится пустое окно zenity значит аргумент есть, только это не картинка, поэтому программа identify не выдает данных (пусто).
На всякий случай на будущее
Цитировать
В момент вызова сценария через подменю «Сценарии» Nautilus всегда устанавливает несколько переменных среды, которые могут использоваться этим сценарием:

NAUTILUS_SCRIPT_SELECTED_FILE_PATHS    разделённые переводами строк пути выбранных локальных файлов
NAUTILUS_SCRIPT_SELECTED_URIS    разделённые переводами строк URI выбранных файлов
NAUTILUS_SCRIPT_CURRENT_URI    текущее местоположение
NAUTILUS_SCRIPT_WINDOW_GEOMETRY    позиция и размер текущего окна

Выбранные файлы могут быть также получены в скрипте с помощью традиционных переменных BASH «$@» и «$*». Если необходимо отображать скрипт в контекстном меню Nautilus только для определённого типа файлов, следует настроить меню «Открыть» в свойствах этого файла стандартным способом, назначив этот скрипт как открывающую программу. В этом случае специальные переменные среды Nautilus, описанные в таблице выше, не устанавливаются, но работают обычные переменные «$@», «$*», «$0» и «$1».
« Последнее редактирование: 18 Июня 2014, 23:43:13 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
правда непонятно почему там есть ещё и «$1.*»
В таком виде не похоже, что оно используется для пакетного режима, поэтому полагаю, что лишнее.

adawdp

  • Автор темы
  • Гость
— Спасибо,.ubuntufan, приятно находиться на одной странице со сведущими людьми :), спасибо за участие. Ваш скрипт очень красиво выглядит, но так же как и мой когда без экранирования, работает только из наутилуса.
— Если изображение находится просто на рабочем столе, а не в отрытой в наутилусе директории рабочий стол, вот так,

то скрипт выдаёт пустое окно вот такое:

— Если же открыть в наутилусе  директорию Рабочий стол, то из наутилуса скрипт работает.
— Спасибо за ссылки буду читать, не исключено, что даже кое-что, кое-где пойму :)!
∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞
— Представьте себе ,ArcFi, Вы оказались правы! :) Я Выполнил Ваши предписания об экранировании и скрипт заработал на рабочем столе, про пакетный режим Вы тоже правы, это у меня были попытки, но что-то оно пока криво работает, буду читать…
∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞
Azure, Вы же знаете, что Вам я всегда рад! :) Я помнил про эти вещи, что Вы написали, но как-то не получилось у меня это применить в данной ситуации, хотя попытки были.
— Всем спасибо, поскольку всё работает будем считать вопрос исчерпанным.
— Вот на этом варианте закончил:
Код: (bash) [Выделить]
#!/bin/bash
# Получить данные об изображении…
while [ $# -ne 0 ]
do
identify -verbose "$1" | grep -A 2 Geometry | sed "/size/s/:\s*/&x/" | awk -Fx '! /size/ { print } ; /size/ { CONVFMT = "%.1f mm"; print $1 $2*25.4" x "$3*25.4 } ' | zenity --title="KapTuHKa" --text-info --width=300 --height=170
shift
done
— Получить данные о нескольких изображениях пока не буду пытаться делать, там масса проблем (во всяком случае для меня). У меня что-то там получалось, но открывалось несколько окон zinity для каждого изображения отдельно плюс не удавалось „подписать“ вывод именем файла каждого изображения и т.п. потом, заматерею в теории и навалюсь :)!
« Последнее редактирование: 19 Июня 2014, 06:09:19 от adawdp »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
ТС, конструкция вида
while [ $# -ne 0 ]
do
 # какие-то команды используют $1
        shift
done
применяется для последовательной обработки аргументов командной строки.
Т.е. после выполнения каких-то команд очередным первым параметром ($1) становится следующий (обратите внимание на команду shift ).

В наутилусе выделяете требуемые файлы - нажимаете ПКМ - выбираете ваш скрипт
В результате выполняется команда
Выбранный_скрипт перечень_параметров_(Это_выбранные_файлы_в_наутилусе)

Далее.
Если Вам требуется не выбирать файлы, а обработать все скопом, то лучше использовать find.

 
« Последнее редактирование: 19 Июня 2014, 08:53:10 от alexander.pronin »

adawdp

  • Автор темы
  • Гость
— Спасибоalexander.pronin, в „черне“ я понял, пока читаю различные популярные публикации по „скриптописанию“, хотя по идее нужно бы больше налечь на фундаментальные основы, но до того там всего много, как мне лет :)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
У меня что-то там получалось, но открывалось несколько окон zinity для каждого изображения отдельно плюс не удавалось „подписать“ вывод именем файла каждого изображения и т.п.
Да, по логике скрипта будет выводить несколько окон (столько, сколько выделено файлов). "Подписать" окно не так уж и сложно, у Вас же оно есть: zenity --title="KapTuHKa" меняете на имя файла zenity --title="$1" (будет выводить полное имя с путем). Можете каким-то образом отформатировать — например, если не нужен путь --title=$(basename "$1")
Если Вы хотите использовать одно окно, но вывод параметров предварять названием файла изменив немного строку awk
Код: (bash) [Выделить]
awk -Fx -vn=$(basename "$1") 'BEGIN { print "  File name:  "n } ; ! /size/ ; … , то придется "собрать" все данные в одну переменную используя конструкцию result=${result}\\n$(identify -verbose … ) либо временный файл  >> /tmp/result.file , а вывести в zenity один раз уже после цикла (не забыв удалить потом временный файл).
Если же скрипт рассчитан на 1 файл ИМХО расточительно использовать конструкцию цикла while … do … shift done. Достаточно просто сделать проверку на наличие аргумента
Код: (bash) [Выделить]
if [ $# -ne 0 ]
then
        identify -verbose "$1" | grep -A 2 Geometry | sed "/size/s/:\s*/&x/" |\
        awk -Fx '! /size/ ; /size/ { CONVFMT = "%.1f mm"; print $1 $2*25.4" x "$3*25.4 } ' |\
        zenity --title=$(basename "$1") --text-info --width=300 --height=170
else
        zenity --warning --text="Any selected file \!"
fi
« Последнее редактирование: 19 Июня 2014, 14:49:54 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
— До уровня оптимизации кода, Azure, я ещё не заматерел :), но выполнять рекомендации уже могу! Так что появился свет в конце тоннеля, жаль вот только, что тоннель не кончается …
— Спасибо, кое-что применил, остальное сохранил для изучения и понимания…

 

Страница сгенерирована за 0.05 секунд. Запросов: 24.