私はexec行で生成されたプロセスの名前を取得するためにこのシェルスクリプトを作成しました。
私の問題は、Arduino IDEで試してみるとエラーが発生することです。私はそれを調べて、そのexec行は別のシェルスクリプトです。
これが私の問題かどうかはわかりませんが、ロードしようとしましたが、できないようです。
私のスクリプト
#!/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')