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

관련 정보