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