Попытка получить имя процесса из строки Exec = в файле .desktop. Ошибка при запуске Exec =, когда это сценарий bash
Я написал этот сценарий оболочки, чтобы получить имя процесса, порожденного строкой 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"
Кто-нибудь знает почему или проливает свет на это?
Ответы
Похоже, ваша 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')