![尝试从 .desktop 文件中的 Exec= 行获取进程名称。当它是 bash 脚本时运行 Exec= 时出错](https://linux22.com/image/175070/%E5%B0%9D%E8%AF%95%E4%BB%8E%20.desktop%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%20Exec%3D%20%E8%A1%8C%E8%8E%B7%E5%8F%96%E8%BF%9B%E7%A8%8B%E5%90%8D%E7%A7%B0%E3%80%82%E5%BD%93%E5%AE%83%E6%98%AF%20bash%20%E8%84%9A%E6%9C%AC%E6%97%B6%E8%BF%90%E8%A1%8C%20Exec%3D%20%E6%97%B6%E5%87%BA%E9%94%99.png)
我编写了这个 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')