พยายามรับชื่อกระบวนการจาก Exec = line ในไฟล์. desktop เกิดข้อผิดพลาดเมื่อเรียกใช้ Exec = เมื่อเป็น bash script

Jun 12 2020

ฉันได้เขียนเชลล์สคริปต์นี้เพื่อรับชื่อของกระบวนการที่เกิดจากบรรทัด 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"

มีใครรู้ว่าทำไมหรือให้ความกระจ่างกับมัน?

คำตอบ

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