Đang cố gắng lấy tên tiến trình từ dòng Exec = trong tệp .desktop. Lỗi khi chạy Exec = khi nó là một tập lệnh bash

Jun 12 2020

Tôi đã viết tập lệnh shell này để lấy tên của quá trình được tạo ra từ dòng thực thi.

Vấn đề của tôi là khi tôi thử nó trên Arduino IDE, tôi gặp lỗi. Tôi đã điều tra và dòng thực thi của nó là một tập lệnh shell khác.

Tôi không chắc đây có phải là vấn đề của mình hay không nhưng tôi đã cố gắng giải quyết vấn đề để làm cho nó tải và dường như tôi không thể.

Kịch bản của tôi

#!/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

Lỗi

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" ====

Nhưng nếu tôi chạy thì đây là thiết bị đầu cuối hoạt động tốt.

bash "/home/lewis/builds/arduino/arduino-1.8.12/arduino"

Bất kỳ ai biết tại sao hoặc làm sáng tỏ về nó?

Trả lời

3 terdon Jun 12 2020 at 13:44

Có vẻ như exebiến của bạn có tên của tập lệnh được trích dẫn. Vì vậy, nếu kịch bản là foo.sh, thì $exethực sự là "foo.sh"và không foo.sh. Do đó, bạn đang nói với bash để tìm một tệp có tên bao gồm những dấu ngoặc kép đó. Để minh họa, đây là một ví dụ nhân tạo:

$ cat foo.sh
#!/bin/sh
echo "It ran!"

Bây giờ, hãy đặt một biến thành tên của tập lệnh được trích dẫn:

$ exe='"foo.sh"' $ echo "$exe"
"foo.sh"

Và cố gắng chạy nó:

$ bash "$exe"
bash: "foo.sh": No such file or directory

Và điều tương tự nhưng không đặt tên của các tập lệnh đã được trích dẫn trong biến:

$ exe="foo.sh"
$ echo "$exe"
foo.sh
$ bash "$exe"
It ran!

Vì vậy, chỉ cần xóa dấu ngoặc kép và bạn sẽ được đặt:

exe=$(grep '^Exec' "$1" | tail -1 | sed 's/^Exec=//; s/%[a-zA-Z]*//; s/"//g')