.desktopファイルのExec =行からプロセス名を取得しようとしています。BashスクリプトでExec =を実行するとエラーが発生する

Jun 12 2020

このシェルスクリプトを作成して、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 Jun 12 2020 at 13:44

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')