Рейтинг:0

Откройте документ в уже запущенном приложении Xorg из bash

флаг tn

Есть ли способ указать уже запущенной x-программе открыть файл из bash? (т.е. без вызова нового экземпляра программы). Пока я задаю этот вопрос в контексте xstata-mp, меня вообще интересует, существует ли такое решение в общем для приложений Xorg.

У меня есть x-приложение (xstata-mp, собственность, которая имеет отношение к этому вопросу, как вы узнаете), которая хорошо работает. Мне удалось сделать хороший скрипт запуска, который сначала проверяет, xstata-mp уже запущен, и если он есть, выводит его на передний план, а иначе запускает. Так же, как принятый ответ на этот вопрос. Это важно, поскольку приложение устанавливается как часть лицензии сайта, разрешающей только ограниченное количество одновременных «мест» (технически я должен запускать его только один раз на одной машине).

Моя проблема в том, что иногда я хочу открыть документ использован xstata-mp (например, .dta файл данных, а .делать файл сценария, а .sthlp справочный файл и др.). Если я дважды щелкну значок такого файла или выберу значок и нажму <ENTER> пока xstata-mp уже запущен, вызывается скрипт запуска (на него есть ссылка в исполнитель часть xstata-mpх .рабочий стол файл) и xstata-mp поднимается наверх видимых окон, но без открытия документа.

Для чего это стоит, проверяя с пидоф похоже, что xstata-mp не запустить новый xstata-mp процесс, если я открываю в нем несколько документов (например, используя <CTRL>-О); контрастировать, скажем, Fire Fox и несколько вкладок/сайтов.

Вот сценарий запуска, который я хотел бы изменить:

# Проверяем, запущен ли xstata-mp v17
exit_code_pidof_xstata_mp=$(pidof/usr/local/stata17/xstata-mp)

# если xstata-mp v17 НЕ запущен, то запустить его с аргументом $1
если [ -z "$exit_code_pidof_xstata_mp" ]
  тогда
    /usr/local/stata17/xstata-mp -q $1; выход >/dev/null
 # но если xstata-mp v17 работает, то выведите его на передний план
 еще
  wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; выход > /dev/null
  фи
Рейтинг:1
флаг in

First of all you should find out the correct command to open your document. So try to run the following command and see what you get.

/usr/local/stata17/xstata-mp --help

Of course this is the critical part. And here you rely solely on the functionality of your program. If it does not offer that option, well, then you cannot do it, because all a bash can ever do is start another program. From the 9.4 MB user manual with 399 pages I downloaded from StataCorp LLC, there was not a single hint on how to use xstata-mp.

Maybe the -q option is already what you want. But let's assume the right option to add another document to an already running instance of xstata-mp would be -a (like in VS Code: code -a). Then all you have to do, is to add the following line below your else statement:

/usr/local/stata17/xstata-mp -a "$1"

It would open your document and show the current window now.

Lexible avatar
флаг tn
Спасибо, Марк. +1 Я действительно уже читал `xstata-mp --help`, а также то, что там не задокументировано (например, аргумент `doedit`) в официальной документации. Я боялся, что ответ, подобный вашему, может быть не за горами, но задал свой вопрос в надежде, что может быть какой-то стандарт интерфейса для приложений Xorg в соответствии с моим запросом. (Кстати, если есть, аргумент `-a` не тот. ;). (Кроме того: опция `-q` не имеет отношения к моим опасениям здесь.)
Lexible avatar
флаг tn
Эй, Марк. Я только что узнал и играю с `xdotool`, который позволяет манипулировать (нажатием клавиш, текстом, вводом указателя, окнами, некоторыми связанными переменными и т. д.) программами Xorg. Когда я отредактирую свой скрипт, чтобы он работал, я напишу ответ, но хотел сообщить, что есть решение для приложений Xorg в целом! :)))
Lexible avatar
флаг tn
Хорошо, смотрите мой ответ. :)
Рейтинг:0
флаг tn

ДА: есть способ указать уже запущенной x-программе открыть файл из bash!

Итак, по совету техподдержки StataCorp, оказалось, что xdotool (который можно установить с помощью sudo apt установить xdotool, если его еще нет в вашей системе) предлагает решение именно той проблемы, о которой идет речь в моем вопросе. С сайта проекта:

xdotool позволяет имитировать ввод с клавиатуры и мышь, перемещать окна и изменять их размер и т. д.Для этого используется расширение XTEST X11 и другие функции Xlib.

✓ Примечание: Если вы используете Wayland, имейте в виду, что это программное обеспечение не будет работать правильно. ï¸

С xdotool, вы можете искать окна и перемещать, изменять размер, скрывать и изменять свойства окна, такие как заголовок. Если ваш оконный менеджер поддерживает это, вы можете использовать xdotool для переключения рабочих столов, перемещения окон между рабочими столами и изменения количества рабочих столов.

Чтобы решить мою проблему с xdotool, мне нужно было создать xdotool сценарий, который я вызываю statadoc.xdo:

#!/usr/bin/xdotool
search --name "Stata/MP"
тип --окно %1 '$1' '$2'
ключ --окно %1 Возврат

Несколько комментариев к этому короткому скрипту:

  1. Путь может быть чем-то иным, чем /USR/бен/xdotool, поэтому обязательно подтвердите это с помощью какой xdotool или похожие.
  2. Вторая строка будет частично соответствовать названию "Стата/МП 17.0" со строкой, предоставленной выше. Это полезно, так как, например, при обновлении версии до 17.1 или 18.x скрипт не сломается. поиск Команда определяет окно X-приложения, с которым я хочу взаимодействовать.
  3. xdotool скрипты принимают аргументы, следующие бить-нравиться $1, $2и т.п. условности.
  4. тип команда буквально печатает предоставленный текст — в моем случае содержимое двух предоставленных $1 и $2 строковые аргументы в 1-м (и только в моем случае) окне, определяемом поиск команда в строке 2.
  5. ключ команда отправляет <ENTER> (или же <RETURN> если хотите) в то же окно Stata.

Теперь давайте посмотрим на мой модифицированный скрипт запуска, который вызывает statadoc.xdo в третьей-последней строке (я добавил раздел впереди, чтобы узнать, указывает ли предоставленный аргумент на определенные типы файлов Stata — разные команды использования необходимы для изящной обработки каждого … мой пример неполный, но это типы файлов Я использую в большинстве своих работ):

# Проверяем НЕТ ли аргумента. Если нет, ничего не делайте.
если [-z "$1"]
  тогда
    сломать
 # В противном случае установите префикс на значение по умолчанию, а затем проверьте 
 # оканчивается ли имя файла на .hlp, .sthlp, .ado, .do или .gph
 еще
  префикс = «использовать»
  если [ ${1##*.} = "hlp" ] || [ ${1##*.} = "sthlp" ] || [ ${1##*.} = "адо" ] || [ ${1##*.} = "делать" ]
    тогда
      # Если имя файла ДЕЙСТВИТЕЛЬНО заканчивается одним из этих четырех префиксов, то
      # изменить префикс на "doedit", чтобы Stata открывал документ с помощью 
      # редактор do-файлов.
      префикс = «редактировать»
    фи
  # Если имя файла заканчивается на .gph, измените префикс на "doedit", чтобы 
  # Stata открывает документ с помощью средства просмотра/редактора графиков.
  если [ ${1##*.} = "gph" ]
    тогда
      prefix="использование графа"
    фи
  сломать
  фи

# Проверяем, запущен ли xstata-mp v17
exit_code_pidof_xstata_mp=$(pidof/usr/local/stata17/xstata-mp)

# если xstata-mp v17 НЕ запущен, то запустить его с аргументом $1
если [ -z "$exit_code_pidof_xstata_mp" ]
  тогда
    /usr/local/stata17/xstata-mp -q $1; выход >/dev/null
 # но если xstata-mp v17 работает, то выведите его на передний план
 еще
  # Сначала вызовите statadoc.xdo с префиксом в качестве первого аргумента, 
  # и указанный путь к файлу в качестве второго аргумента 
  /usr/share/stata17/bin/statadoc.xdo "префикс $" "$1"
  wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; выход > /dev/null
  фи

Примечание. Это решение для Gnome, работающего на Xorg.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.