' 및 & 없이 변형을 시도하고 전체 경로를 철자하고 $PATH에 추가했습니다. 하이퍼핑을 호출하는 스크립트와 동일한 디렉터리에 있더라도 스크립트가 하이퍼핑을 찾을 수 없는 것 같습니다. 사용자 pi로 실행합니다. 내 머리카락을 뽑아라! ! 스크립트의 실제 줄
if [ $(/usr/bin/pgrep -c hyperping) -eq 0 ]; then './hyperping &'; fi
PATH의 "하이퍼핑" [$PATH로 확인, 삭제 &로도 확인]
***pi@pi20:~/tests $ ls -lt hyperping
-rwxr-xr-x 1 pi pi 692 Jul 30 13:10 hyperping***
"hyperping"은 독립적으로 잘 작동합니다.
"set -xv"를 사용한 bash 출력
***/++ /usr/bin/pgrep -c hyperping
+ '[' 0 -eq 0 ']'
+ '/home/pi/tests/hyperping &'
./at7PM: line 33: /home/pi/tests/hyperping &: *No such file or
directory*/****
답변1
을 실행하고 있지 않고 문자 그대로 공백과 이라는 이름의 명령을 hyperping
실행하려고 합니다 . 이는 명령을 불필요하게 따옴표로 묶었기 때문에 발생합니다 .hyperping &
&
./hyperping &
'./hyperping &'
나는 당신이 다음과 같은 일을 할 계획이라고 가정합니다
if ! pgrep hyperping >/dev/null; then
hyperping &
fi
조용히 할 수 있는 옵션이 pgrep
있다면 포기할 수 있습니다 .-q
>/dev/null
if ! pgrep -q hyperping; then
hyperping &
fi
이 명령 은 찾고 있는 것을 성공적으로 찾은 경우 종료 상태 0으로 종료하고, 그렇지 않으면 0이 아닌 종료 상태로 종료되는 pgrep
것처럼 동작합니다 . grep
실제 구문 분석을 피하기 위해 위에 표시된 접근 방식을 사용할 수 있습니다.산출단서를 명령하여 무언가가 발견되었는지 여부에 대한 단서를 얻습니다. " run이라는 명령이 if ! pgrep somecommand; then ...; fi
없으면..."이라고 읽을 수 있습니다 .somecommand
답변2
SELECT가 깨지지 않았습니다!
' 및 & 없이 변형을 시도하고 전체 경로를 철자하고 $PATH에 추가했습니다.
Kusalamanda는 공백과 앰퍼샌드를 포함하여 명령 주위에 임의의 따옴표를 추가하는 오류를 지적했습니다. 이렇게 하지 마세요. 모두 테스트하기에는 미친 아이디어가 너무 많습니다.
Bash 및 유사한 쉘의 따옴표는 대부분의 다른 프로그래밍 언어와 다릅니다. 주요 목적은 공백 및 기타 공백 문자를 보존하는 것입니다. 불행하게도 많은 개발자들은 무의식적으로 다른 언어에서 구문 규칙을 가져와 모든 문자열에 따옴표가 필요한 것처럼 행동합니다.
하이퍼핑을 호출하는 스크립트와 동일한 디렉터리에 있더라도 스크립트가 하이퍼핑을 찾을 수 없는 것 같습니다.
이것은 전혀 관련이 없습니다. 어쩌면 첫 번째 오류를 방해하는 두 번째 오류일 수도 있습니다.
실행 파일이 경로에 있기 때문에 발견되면 경로를 제공하지 않고 호출해야 합니다.
또는 경로에 없으면 상대 경로(예: ./some/where/script.sh) 또는 절대 경로를 제공해야 합니다. 상대 경로는 호출된 호출자(셸에 있는 사용자)를 기준으로 간주되며 간접적으로 호출하는 다른 스크립트/프로그램에 상대적인 것으로 간주되지 않습니다.
스크립트가 경로에 있는 경우 이와 같은 상대 경로로 호출하지 마세요 ./hyperping
. 하지만 hyperping
상대 경로로 호출하면 경로를 사용하여 찾는 것이 아니라 위치에 따라 달라지기 때문입니다. 일반적으로 나쁜 생각입니다.