Bash

試圖從 .desktop 文件中的 Exec= 行獲取程序名稱。執行 Exec= 當它是一個 bash 腳本時出錯

  • June 12, 2020

我編寫了這個 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')

引用自:https://unix.stackexchange.com/questions/592509