พยายามรับชื่อกระบวนการจาก Exec = line ในไฟล์. desktop เกิดข้อผิดพลาดเมื่อเรียกใช้ Exec = เมื่อเป็น bash script
ฉันได้เขียนเชลล์สคริปต์นี้เพื่อรับชื่อของกระบวนการที่เกิดจากบรรทัด 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"
 
    มีใครรู้ว่าทำไมหรือให้ความกระจ่างกับมัน?
คำตอบ
ดูเหมือนว่า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')