최근 서버에 유틸리티를 설치했는데 에서 구매가 이루어진 것을 확인했습니다 sudo
. 즉, foo
예상대로 구매가 실행되었습니다 .sudo foo
sudo: foo: command not found
나는 이것을 .sudo 링크와 함께 명령 /usr/local/bin
과 sudo를 사용하여 추적했습니다. 설치 스크립트를 수정하여 설치했는데 모든 것이 순조롭게 진행되었습니다.PATH
/usr/bin
/usr/bin
이 상황을 감지하고 나중에 뭔가 변경되어 어떤 이유로든 명령을 사용할 수 없는 경우 오류를 보고하도록 서버 설정 스크립트를 변경하고 싶습니다. 나 이거부터 일하고 있어StackOverflow 질문그리고 그 대답은 다음과 같은 테스트를 사용하는 것을 제안합니다.
command -v foo >/dev/null 2>&1 || { echo "I require foo but it's not installed. Aborting." >&2; exit 1; }
그러나 이는 예상한 것과 다릅니다 sudo
.
$ command -v foo
/usr/bin/foo
$ sudo command -v foo
sudo: command: command not found
$ sudo type foo
sudo: type: command not found
$ sudo hash -v foo
sudo: hash: command not found
$ sudo foo
...executes normally...
$ sudo bash
# command -v foo
/usr/bin/foo
# sudo command -v foo
sudo: command: command not found
# foo
...executes normally...
# sudo foo
...executes normally...
이상하게도 sudo which foo
명령이 발견되었습니다 /usr/bin/
. 명령을 실행하면 sudo which bar
sudo 경로에 실제로 명령이 포함되어 있다는 메시지가 표시됩니다. 이는 하위 명령을 시작할 때를 의미합니다 which: no foo in (/sbin:/bin:/usr/sbin:/usr/bin)
./usr/bin
무슨 일이야?
명령을 호출할 수 있는지 확인하기 위해 어떤 테스트를 실행할 수 있습니까?sudo
아니요명령을 내리시겠습니까? (또한 which
연결된 질문의 일부 의견과 답변에 따라 전화하지 않고 경고합니다. 그렇지 않으면 문제가 없습니다...)
답변1
sudo
바이너리를 실행하는 데 사용되므로 쉘이 실행되지 않으면 쉘 내장 기능을 사용할 수 없습니다. bash -c
bash에게 다음 인수를 해석하도록 지시하여 실행에 문자열을 해석 하고 올바른 내장 함수를 호출하도록 sudo bash -c "command -V <exe>"
지시합니다 .sudo
bash
command -V <exe>