Bash
試圖從 .desktop 文件中的 Exec= 行獲取程序名稱。執行 Exec= 當它是一個 bash 腳本時出錯
我編寫了這個 shell 腳本來獲取從 exec 行生成的程序的名稱。
我的問題是當我在 Arduino IDE 上嘗試時出現錯誤。我進行了調查,它的 exec 行是另一個 shell 腳本。
我不確定這是否是我的問題,但我一直在嘗試使用它來載入它,但我似乎無法載入。
我的劇本
#!/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
錯誤
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" ====
但如果我執行這是終端,它工作正常。
bash "/home/lewis/builds/arduino/arduino-1.8.12/arduino"
任何人都知道為什麼或闡明它?
看起來您的
exe
變數具有引用的腳本名稱。所以,如果腳本是foo.sh
,那麼$exe
實際上是"foo.sh"
而不是foo.sh
。因此,您告訴 bash 查找名稱中包含這些引號的文件。為了說明,這裡有一個人為的例子:$ cat foo.sh #!/bin/sh echo "It ran!"
現在,將變數設置為引用的腳本名稱:
$ exe='"foo.sh"' $ echo "$exe" "foo.sh"
並嘗試執行它:
$ bash "$exe" bash: "foo.sh": No such file or directory
同樣的事情,但沒有將已經引用的腳本名稱放在變數中:
$ exe="foo.sh" $ echo "$exe" foo.sh $ bash "$exe" It ran!
因此,只需刪除引號,您就應該設置:
exe=$(grep '^Exec' "$1" | tail -1 | sed 's/^Exec=//; s/%[a-zA-Z]*//; s/"//g')