Некоторые из кода оболочки из этого источника не выполняют то, что он утверждает; в основном тип, который идет:
if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
Это выполняется vlc & в двух случаях. Если нет процессов, соответствующих «vlc», и если есть ровно один процесс, соответствующий «vlc». Если существует более одного процесса, соответствующего «vlc», vlc & не будет запущен. Таким образом, эти блоки являются бесполезными. Просто vlc &, скорее всего, будет более корректным.
В Интернете, к сожалению, часто встречается плохой совет.
Из вашего описания проблемы, что вы хотите получить, это программа запускается, если она еще не запущена, и если она запущена, принесите это окно на передний план и придайте ей фокус. Для этого можно использовать wmctrl.
wmctrl -a 'Mozilla Firefox' найдет в своем названии окно, содержащее «Mozilla Firefox», и «активирует» его. То есть, перейдите к рабочему пространству, в котором он находится, выведите его на передний план и придайте ему фокус. Во-вторых, если никакие окна не совпадают, wmctrl ничего не сделает и не выйдет с ненулевым (ложным) статусом выхода, и в этом случае мы можем предположить, что программа не запущена, и запустите ее.
wmctrl -a 'Mozilla Firefox' || firefox &
[d6 ] Это все еще не идеально. Другие окна, кроме окон firefox, потенциально могут содержать эту строку в заголовке, поэтому мы должны найти более надежный способ определения правильного окна в этом случае. С -x, wmctrl будет работать на VM_CLASS которое обычно имеет уникальное значение для каждой программы. Все окна firefox будут иметь VM_CLASS «Navigator.Firefox», как видно из запуска wmctrl -lx при запуске firefox
$ wmctrl -lx
...
0x03ba3d43 3 gnome-terminal.Gnome-terminal pilot Terminal
0x04c000bc 0 Navigator.Firefox pilot Group #1 - Speed Dial - Mozilla Firefox
С помощью этого мы можем выбрать окно с точно «Navigator.Firefox» как VM_CLASS
wmctrl -Fxa Navigator.Firefox || firefox &
То же самое, мы надеемся, будет применимо и к другим программам.