Попытка получить имя процесса из строки Exec = в файле .desktop. Ошибка при запуске Exec =, когда это сценарий bash

Jun 12 2020

Я написал этот сценарий оболочки, чтобы получить имя процесса, порожденного строкой exec.

Моя проблема в том, что когда я пробую его в Arduino IDE, я получаю сообщение об ошибке. Я исследовал, и его строка exec - это еще один сценарий оболочки.

Я не уверен, что это моя проблема, но я пытался поиграть с ней, чтобы она загрузилась, и я просто не могу.

Мой сценарий

#!/bin/bash

exe=$(grep '^Exec' "$1" | tail -1 | sed 's/^Exec=//' | sed 's/%[a-zA-Z]*//')
type=$(file $exe | grep "Bourne-Again")

if [ -z "$type" ]; then echo Debug - its a shell script bash "$exe" &
else
  echo Debug - its not a shell script
  $exe & fi PID=$(echo $!) process=$(ps --no-header -p $PID -o comm) kill -SIGTERM $PID

echo $exe echo $process

Ошибка

bash PycharmProjects/touch_mouser/TouchMouser/get_exe_and_process_name.sh "/usr/share/applications/arduino-arduinoide.desktop"

Debug - its a shell script
bash: "/home/lewis/builds/arduino/arduino-1.8.12/arduino": No such file or directory
PycharmProjects/touch_mouser/TouchMouser/get_exe_and_process_name.sh: line 15: kill: (27840) - No such process
"/home/lewis/builds/arduino/arduino-1.8.12/arduino" ====

Но если я запускаю это терминал, он работает нормально.

bash "/home/lewis/builds/arduino/arduino-1.8.12/arduino"

Кто-нибудь знает почему или проливает свет на это?

Ответы

3 terdon Jun 12 2020 at 13:44

Похоже, ваша exeпеременная имеет имя процитированного скрипта. Так что, если сценарий есть foo.sh, то $exeна самом деле "foo.sh"и нет foo.sh. Следовательно, вы говорите bash найти файл, имя которого включает эти кавычки. Для иллюстрации вот искусственный пример:

$ cat foo.sh
#!/bin/sh
echo "It ran!"

Теперь установите переменную в указанное имя сценария:

$ exe='"foo.sh"' $ echo "$exe"
"foo.sh"

И попробуйте запустить его:

$ bash "$exe"
bash: "foo.sh": No such file or directory

И то же самое, но без указания названий скриптов, уже цитируемых в переменной:

$ exe="foo.sh"
$ echo "$exe"
foo.sh
$ bash "$exe"
It ran!

Итак, просто удалите кавычки, и у вас должно получиться:

exe=$(grep '^Exec' "$1" | tail -1 | sed 's/^Exec=//; s/%[a-zA-Z]*//; s/"//g')