.desktopファイルのExec =行からプロセス名を取得しようとしています。BashスクリプトでExec =を実行するとエラーが発生する
このシェルスクリプトを作成して、exec行から生成されたプロセスの名前を取得しました。
私の問題は、ArduinoIDEで試してみるとエラーが発生することです。調査したところ、その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"
誰かがその理由を知っているか、それに光を当てていますか?
回答
3 terdon
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')