Mencoba mendapatkan nama proses dari baris Exec = di file .desktop. Kesalahan saat menjalankan Exec = saat skrip bash

Jun 12 2020

Saya telah menulis skrip shell ini untuk mendapatkan nama proses yang muncul dari baris exec.

Masalah saya adalah ketika saya mencobanya di Arduino IDE saya mendapatkan kesalahan. Saya menyelidiki dan baris eksekutifnya adalah skrip shell lain.

Saya tidak yakin apakah ini masalah saya, tetapi saya telah mencoba bermain-main dengannya untuk membuatnya dimuat dan sepertinya saya tidak bisa melakukannya.

Skrip saya

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

Kesalahannya

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

Tetapi jika saya menjalankan ini adalah terminal itu berfungsi dengan baik.

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

Adakah yang tahu mengapa atau menjelaskannya?

Jawaban

3 terdon Jun 12 2020 at 13:44

Sepertinya exevariabel Anda memiliki nama skrip yang dikutip. Jadi, jika skripnya foo.sh, maka $exesebenarnya "foo.sh"dan tidak foo.sh. Oleh karena itu, Anda memberi tahu bash untuk menemukan file yang namanya menyertakan tanda kutip tersebut. Sebagai ilustrasi, berikut adalah contoh buatan:

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

Sekarang, setel variabel ke nama skrip yang dikutip:

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

Dan coba jalankan:

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

Dan hal yang sama tetapi tanpa mencantumkan nama skrip yang sudah dikutip dalam variabel:

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

Jadi, hapus saja tanda kutipnya dan Anda harus mengatur:

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