.desktop 파일의 Exec = 줄에서 프로세스 이름을 가져 오려고합니다. bash 스크립트 일 때 Exec = 실행시 오류
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')