Próba uzyskania nazwy procesu z wiersza Exec = w pliku .desktop. Błąd podczas uruchamiania Exec =, gdy jest to skrypt bash
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
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')