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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

adawdp

  • Автор темы
  • Гость
— Здр.! Все.
— Я совершенно не программист, но скрипт написать хотелось. Я „со словарём :)“ и с посторонней помощью  что-то написал.
Код: Bash
  1. #!/bin/sh
  2. # Получить данные об изображении…
  3. while [ $# -ne 0 ]
  4. do
  5.         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
  6.         shift
  7. done
— Если запускать из Nautilus→Сценарии→Имя скрипта даёт такие сведения об изображении.

— Но при запуске просто на рабочем столе появляется только пустое окно zenity без данных.
— Это так и должно быть или что-то где-то можно подправить?
— Если положим выводить данные в буфер обмена, то тоже не работает скрипт на рабочем столе, хотя из nautilus'a работает…
Код: Bash
  1. #!/bin/sh
  2. # Получить в буфер данные об изображении…
  3. while [ $# -ne 0 ]
  4. do
  5.         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
  6.         shift
  7. 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
  1. #!/bin/bash
  2. # Получить данные об изображении…
  3.  
  4. function showImageInfo {
  5.         identify -verbose $1 |\
  6.         grep -A 2 Geometry |\
  7.         sed "/size/s/:\s*/&x/" |\
  8.         awk -Fx '! /size/ { print } ; /size/ { CONVFMT = "%.1f mm"; print $1 $2*25.4" x "$3*25.4 } ' |\
  9.         zenity --title="KapTuHKa" --text-info
  10.  
  11. }
  12.  
  13. while [ $# -ne 0 ]
  14. do
  15.         if [ -d "$1" ]; then
  16.                 for f in $1/*
  17.                 do
  18.                         if [ ! -d "$f" ]; then
  19.                                 identify -ping $f && showImageInfo $f
  20.                         fi     
  21.                 done
  22.         else
  23.                 showImageInfo $1
  24.         fi
  25.                
  26.         shift
  27. done
  28.  
« Последнее редактирование: 19 Июнь 2014, 00:21:47 от .ubuntufan »

Оффлайн ArcFi

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6013
  • 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
  1. #!/bin/bash
  2. # Получить данные об изображении…
  3. while [ $# -ne 0 ]
  4. do
  5.         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
  6.         shift
  7. 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

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

adawdp

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

 

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