Mencoba mendapatkan nama proses dari baris Exec = di file .desktop. Kesalahan saat menjalankan Exec = saat skrip bash
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
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')