尝试从 .desktop 文件中的 Exec= 行获取进程名称。当它是 bash 脚本时运行 Exec= 时出错

尝试从 .desktop 文件中的 Exec= 行获取进程名称。当它是 bash 脚本时运行 Exec= 时出错

我编写了这个 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"

有人知道为什么或对此有任何了解吗?

答案1

看来您的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')

相关内容