질문의 핵심 :
소프트웨어를 설치할 수없는 동안 문제가 생겨서 ./에 대해 진심으로 묻습니다. 소프트웨어에 대해 알지 못했기 때문에 “명령을 찾을 수 없습니다”라는 출력이 실제로 명령의 내용을 혼란스럽게했습니다.
문맥:
파일을 설치하고 싶습니다 truecrypt-7.2-setup-x86
.
지시 사항에 따라 명령을 사용하십시오.
sudo ./truecrypt-7.2-setup-x86
그러나 결과는 다음과 같습니다.
sudo: ./truecrypt-7.2-setup-x86: command not found
업데이트 : 완료를 위해 테스트에서 파일 폴더에 있었지만 아직 파일을 실행 파일로 만들지 않았습니다 (chmod + x).
답변
./
명령이 아닙니다. 명령은 ./truecrypt-7.2-setup-x86
입니다.
쉘과 같은 프로그램 sudo
은 하나 이상의 문자를 포함 할 때 명령을 경로 이름 으로 취급합니다 /
. .
현재있는 디렉토리를 나타내 므로 현재 디렉토리 ./truecrypt-7.2-setup-x86
의 파일 이름을 지정하십시오 truecrypt-7.2-setup-x86
. 그러한 파일이 없거나 파일을 실행할 수 없으면 오류 메시지가 표시됩니다.
명령에 슬래시가 포함되어 있지 않으면 Sergiy Kolodyazhnyy가 말한$PATH
대로 나열된 디렉토리에서 해당 디렉토리 를 검색합니다 . 현재 디렉토리가 자동으로되지 않습니다 검색 -되어 있지 넣어 추천 에 . 그런 식으로, 당신은 당신이 그것을 포함하는 디렉토리에 d가 있기 때문에 당신이 예상하지 않은 것들을 실수로 실행하지 않습니다 ..
$PATH
cd
쓰기 ./
현재 디렉토리의 실행 파일의 이름 앞에 일반적인 방법 을 실행하는, 그러나 이것은 실제로 특수 구문이 아니다. 예를 들어, 당신을 망 쳤고 $PATH
와 같은 명령을 실행 ls
해야한다면 쓸 수 /bin/ls
있습니다. .
이 경우 또는 일반적으로 필요 하지 않습니다 . 필요한 것은 /
경로 이름이라는 것을 나타 내기 위해 경로 이름 의 어딘가에 있습니다.
때문에 .
항상 현재 디렉토리이며, /
단지 디렉토리 분리하고, 할 수있는 첫번째 것은 당신이 명명 한 파일이 실제로 현재 디렉토리에 있는지 확인합니다. (그렇다면 Charles Green이 설명하는 것처럼 권한 을 확인하십시오 . 그러나 아카이브에서 파일을 추출한 경우 실행하려는 경우 일반적으로 이미 실행 권한이 있습니다.)
답변
명령의 ./ 부분은 “현재 디렉토리를보고 여기에서 ‘truecrypt-7.2-setup-x86’명령을 실행하십시오”라고 말합니다. 파일의 압축을 푼 디렉토리에서이 명령을 실행해야합니다.
이를 테스트 할 수 있습니다. 명령을 시도하는 동일한 터미널 창에서 명령을 입력하십시오. ls -l true*
파일이 현재 작업 디렉토리에 있으면 파일을 보여주는 목록 (및 추가 정보)이 표시됩니다.
Zanna가 주석에서 언급했듯이 파일에 실행 권한이 없을 수 있습니다. 쉽게 수정할 수 있습니다. 테스트 사례로 내 디렉토리에
chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
파일 “rFullBack”은 파일을 읽고 쓸 수있는 권한으로 ‘-rw-‘를 나열합니다. 명령을 실행할 수 chmod +x rFullBack
있고 디렉토리 목록이 다음으로 변경됩니다.
chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
거기에서 내 권한은 이제 ‘-rwx’이며 파일을 실행할 수 있음을 나타냅니다.
즉, 파일이 디렉토리에 존재하는 경우
명령을 실행
chmod +x ./truecrypt-7.2-setup-x86
그런 다음 명령
sudo ./truecrypt-7.2-setup-x86
답변
쉘에서 명령을 호출하는 방법
아니요, 명령이 아닙니다. 쉘이 작동하는 방식은 한 줄의 텍스트를 입력 할 때 첫 단어는 명령으로 취급되며, 명령이 쉘 내장 명령 중 하나가 아닌 경우 쉘은 PATH
환경 변수에 나열된 모든 위치를 봅니다. .
실행하려는 명령이 현재 찾은 디렉토리와 동일한 디렉토리에 있지만 해당 디렉토리가 PATH
디렉토리 목록에없는 경우 어떻게됩니까? 그때 당신이 사용해야 ./
합니다. 원하는 방식으로 /bin/bash
쉘에 전체 경로를 알려주는 것입니다. 그리고 ./의 경우에는 “이 디렉토리를 보라”고 말하는 것입니다. 따라서 중요한 부분은 파일이있는 동일한 디렉토리에 있어야한다는 것입니다.
물론 실제로 실행 파일을 실행하려면 실행 가능 비트가 설정되어 있어야합니다 chmod +x ./my_file
.
중요한 단계 :
cd
파일 을 저장 한 위치 ; 그것은에 있다면~/Downloads
다음,cd ~/Downloads
- 실행
chmod +x ./truecrypt-7.2-setup-x86
, 이것은 “에 메이크업 파일의 TrueCrypt-7.2-설치-86라고 이 디렉토리의 실행” - 그리고 지금
sudo ./truecrypt-7.2-setup-x86
사용은 ./
임의의 동작이 아니라 실제로 POSIX (Portable Operating System Interface) 표준에 의해 지정된 표준이며 , 특히 “명령 검색 및 실행”섹션을 참조하십시오.
오류 재현
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
참고 : 오류 메시지 sudo
는 분명히 오해의 소지가 있으므로 명심해야합니다. 그러나 이것은 OP가 요구하는 질문의 핵심 이 아니 었 습니다 .
설명서 및 참조
에서 bash
4.3 수동, “명령 실행”섹션 :
이름이 쉘 함수도 아니고 내장도 아니며 슬래시를 포함하지 않는 경우, bash는 PATH의 각 요소에서 해당 이름으로 실행 파일이 들어있는 디렉토리를 검색합니다.
에서 왜 스크립트 이름 앞에 ./ 당신이 필요로하는 (도트 슬래시) 할 떠들썩한 파티에서 실행하는? :
POSIX 는 /를 포함하는 명령 이름을 파일 이름으로 직접 사용하여 $ PATH에서 검색을 억제하도록 지정 하기 때문에 ./와 함께 작동 합니다 . 똑같은 효과를 위해 전체 경로를 사용할 수는 있지만 ./는 더 짧고 쓰기 쉽습니다.