Essayer d'obtenir le nom du processus à partir de la ligne Exec = dans le fichier .desktop. Erreur lors de l'exécution d'Exec = lorsqu'il s'agit d'un script bash

Jun 12 2020

J'ai écrit ce script shell pour obtenir le nom du processus généré à partir de la ligne exec.

Mon problème est que lorsque je l'essaye sur Arduino IDE, j'obtiens une erreur. J'ai étudié et sa ligne exec est un autre script shell.

Je ne sais pas si c'est mon problème, mais j'ai essayé de jouer avec pour le charger et je n'arrive pas à le faire.

Mon scénario

#!/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

L'erreur

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" ====

Mais si je lance, c'est le terminal, cela fonctionne bien.

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

Quelqu'un sait-il pourquoi ou a-t-il éclairé le sujet?

Réponses

3 terdon Jun 12 2020 at 13:44

Il semble que votre exevariable porte le nom du script cité. Donc, si le script est foo.sh, alors $exeest réellement "foo.sh"et non foo.sh. Par conséquent, vous dites à bash de trouver un fichier dont le nom inclut ces guillemets. Pour illustrer, voici un exemple artificiel:

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

Maintenant, définissez une variable sur le nom du script cité:

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

Et essayez de l'exécuter:

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

Et la même chose mais sans mettre le nom des scripts déjà cités dans la variable:

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

Donc, supprimez simplement les guillemets et vous devriez être défini:

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