LINUX.ORG.RU

Функция для запуска программ/открытия файлов/обработки иных событий.

 , , , ,


0

3

Вариант на bash: http://pastebin.com/sWx7C4XC

Вариант для включения в .zshrc (есть автодополнение): http://pastebin.com/n9zz7s9u

Частично сам, частично не сам, набросал вот такую вещь. Замысел таков: вместо многочисленных лаунчеров типа xfce4-appfinder, gmrun и прочее, мне кажется более удобным запускать эмулятор терминала с соответствующей геометрией, и там запускать команды. Для того, чтобы это было больше похоже на лаунчер, и служит эта функция/этот скрипт.

Суть его такова: проверяем аргумент на соответствие шаблону (строки 6-15), если подходит - выполняем то или иное действие для строки, из которой убран, собственно, идентификатор (для примера - гуглинг по g:запрос и открытие википедии по w:страница). Затем, если то, что ввёл пользователь - это исполняемый файл в $PATH, то выполнить его (способы поиска в $PATH для bash и zsh разные). Дальше - если то, что ввёл пользователь, не находится в $PATH, то проверить - есть такой файл? Если нет, то открыть строку через exo-open (так как там может быть протокол http://, ftp:// или ещё что-то, не являющееся файлом, но открываемое exo-open). Если же это - файл, то проверить его на то, исполняемый ли он. Если исполняемый - то выполнить, иначе - открыть через exo-open.

Если какое-либо из действий было успешно - то открепить запущенное от терминала и закрыть оболочку (если запускается, как скрипт, то сам терминал не закроется, а просто прекратится выполнение скрипта с отвязкой запущенного от терминала. В случае же запуска, как функции zsh, закроется сам zsh, таким образом, будет поведение, как у лаунчеров: набрал, enter, лаунчер закрылся, команда выполнилась).

Вместо exo-open можно использовать xdg-open, kde-open, gnome-open — по желанию. Результат будет примерно одинаковым.

Реализовано ещё не всё, что хотелось бы. Конкретно, мне хотелось бы добавить обработку опций: например, чтобы при -t команда выполнялась в терминале, но я не знаю, как сделать обработку опций так, чтобы это не конфликтовало с основным аргументом функции/скрипта. Буду рад подсказкам. Все желающие приглашаются к тестированию, допилу, указанию на костыли и ошибки и прочее.

Запускать так: если zsh, то всё со второй ссылки добавить в конец .zshrc, и вызывать по «xo строка». Чтобы работало автодополнение, надо его включить в zsh (autoload -Uz compinit, вроде)

Если запускать, как отдельный скрипт на bash - то всё с первой ссылки положить в файл, сделать ему chmod +x и запускать по ./файл строка.

Видео-демонстрация того, как я это использую: https://dropmefiles.com/PUv3I (.ogv файл)

★★

Последнее исправление: Valdor (всего исправлений: 2)

Ответ на: комментарий от shdown

И ещё - Я всё это кладу отдельно в .zshrc как функцию в том числе и затем, чтобы после выполнения команды шелл закрывался и закрывалось окно, в котором всё это происходит. Я решил, что в остальном будет удобнее этот скрипт положить в /usr/local/bin и не озадачиваться сопровождением ещё и .zshrc, но вот проблема - если я эту сущность вызываю, как скрипт, то после исполнения шелл не закрывается (так и должно быть, я знаю). Можно ли что-то изменить внутри скрипта (не трогая остальное), чтобы из него закрывался сам шелл, а не только прекращалось его выполнение?

Valdor ★★
() автор топика
Ответ на: комментарий от Valdor

Потому что в zsh парсинг опций command происходит до раскрытия переменных: https://github.com/zsh-users/zsh/blob/128bf385b1e8256e412d732fa9b80ecd7c5e2c7... — подстановка переменных происходит по мере надобности, и вот этот код https://github.com/zsh-users/zsh/blob/128bf385b1e8256e412d732fa9b80ecd7c5e2c7... этого не делает. Собственно,

flag='-v'
command "$flag" true
тоже не сработает. Надо бы зарепортить.

shdown
()
Ответ на: комментарий от shdown

command xo thunar

Открывает thunar, как надо, и не выходит (потому что без exec), а

exec command xo thunar

закрывает shell и никакого результата

Valdor ★★
() автор топика
Ответ на: комментарий от shdown

У тебя тоже такая проблема?

Работает, отлично :)

Valdor ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.