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