Próba uzyskania nazwy procesu z wiersza Exec = w pliku .desktop. Błąd podczas uruchamiania Exec =, gdy jest to skrypt bash

Jun 12 2020

Napisałem ten skrypt powłoki, aby uzyskać nazwę procesu zrodzonego z linii exec.

Mój problem polega na tym, że kiedy próbuję go na Arduino IDE, pojawia się błąd. Zbadałem i jego wiersz exec to kolejny skrypt powłoki.

Nie jestem pewien, czy to jest mój problem, ale próbowałem się nim bawić, aby się załadował i po prostu nie mogę.

Mój skrypt

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

Błąd

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

Ale jeśli uruchomię, to jest terminal, działa dobrze.

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

Ktoś wie, dlaczego lub rzucił na to trochę światła?

Odpowiedzi

3 terdon Jun 12 2020 at 13:44

Wygląda na to, że exezmienna ma nazwę cytowanego skryptu. Więc jeśli skrypt jest foo.sh, $exeto faktycznie jest, "foo.sh"a nie foo.sh. Dlatego mówisz bashowi, aby znalazł plik, którego nazwa zawiera te cudzysłowy. Aby to zilustrować, oto sztuczny przykład:

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

Teraz ustaw zmienną na nazwę skryptu w cudzysłowie:

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

I spróbuj go uruchomić:

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

I to samo, ale bez umieszczania nazw skryptów już cytowanych w zmiennej:

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

Po prostu usuń cudzysłowy i powinieneś być ustawiony:

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