.desktop ファイルの Exec= 行でプロセス名を確認します。 bashスクリプトのときにExec =実行中にエラーが発生しました。

.desktop ファイルの Exec= 行でプロセス名を確認します。 bashスクリプトのときにExec =実行中にエラーが発生しました。

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

おすすめ記事