./ (점 슬래시)가 명령입니까?


16

질문의 핵심 :

소프트웨어를 설치할 수없는 동안 문제가 생겨서 ./에 대해 진심으로 묻습니다. 소프트웨어에 대해 알지 못했기 때문에 "명령을 찾을 수 없습니다"라는 출력이 실제로 명령의 내용을 혼란스럽게했습니다.

문맥:

파일을 설치하고 싶습니다 truecrypt-7.2-setup-x86.

지시 사항에 따라 명령을 사용하십시오.

sudo ./truecrypt-7.2-setup-x86

그러나 결과는 다음과 같습니다.

sudo: ./truecrypt-7.2-setup-x86: command not found

업데이트 : 완료를 위해 테스트에서 파일 폴더에 있었지만 아직 파일을 실행 파일로 만들지 않았습니다 (chmod + x).


1
./명령 의 일부는 "현재 디렉토리를보고 여기에서 'truecrypt-7.2-setup-x86'명령을 실행하십시오"라고 말합니다. 파일의 압축을 푼 디렉토리에서이 명령을 실행해야합니다.
Charles Green

2
@Videonauth-실제로 개인적으로 나는 그것이 대답의 수준으로 올라 가지 않는다고 생각하지 않습니다.
Charles Green

1
@ 잔나 나는 실행 권한이없는 스크립트를 테스트했으며 오류가 발생하면 명령을 찾을 수없는 권한 오류가 누락되었습니다.
Charles Green

2
@ubuntubu 좋아, 당신은 디렉토리로 옮겼습니다. 그래도 편집에 대한 작은 의견. 명령은 chmod +x, 그 chmod -x반대입니다-실행 권한을 제거합니다
Sergiy Kolodyazhnyy

4
질문 제목은 본문과 상당히 다릅니다. 어쩌면 그 문제를 해결해야합니까?
David Z

답변:


24

./명령이 아닙니다. 명령은 ./truecrypt-7.2-setup-x86입니다.

쉘과 같은 프로그램 sudo은 하나 이상의 문자를 포함 할 때 명령을 경로 이름 으로 취급합니다 /. .현재있는 디렉토리를 나타내 므로 현재 디렉토리 ./truecrypt-7.2-setup-x86의 파일 이름을 지정하십시오 truecrypt-7.2-setup-x86. 그러한 파일이 없거나 파일을 실행할 수 없으면 오류 메시지가 표시됩니다.

명령에 슬래시가 포함되어 있지 않으면 Sergiy Kolodyazhnyy가 말한$PATH 대로 나열된 디렉토리에서 해당 디렉토리 를 검색합니다 . 현재 디렉토리가 자동으로되지 않습니다 검색 -되어 있지 넣어 추천 에 . 그런 식으로, 당신은 당신이 그것을 포함하는 디렉토리에 d가 있기 때문에 당신이 예상하지 않은 것들을 실수로 실행하지 않습니다 ..$PATHcd

쓰기 ./현재 디렉토리의 실행 파일의 이름 앞에 일반적인 방법 을 실행하는, 그러나 이것은 실제로 특수 구문이 아니다. 예를 들어, 당신을 망 쳤고 $PATH와 같은 명령을 실행 ls해야한다면 쓸 수 /bin/ls있습니다. .이 경우 또는 일반적으로 필요 하지 않습니다 . 필요한 것은 /경로 이름이라는 것을 나타 내기 위해 경로 이름 의 어딘가에 있습니다.

때문에 .항상 현재 디렉토리이며, /단지 디렉토리 분리하고, 할 수있는 첫번째 것은 당신이 명명 한 파일이 실제로 현재 디렉토리에 있는지 확인합니다. (그렇다면 Charles Green이 설명하는 것처럼 권한 을 확인하십시오 . 그러나 아카이브에서 파일을 추출한 경우 실행하려는 경우 일반적으로 이미 실행 권한이 있습니다.)


21

명령의 ./ 부분은 "현재 디렉토리를보고 여기에서 '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

1
좀 빠지는. setid 및 sticky 비트 이전에 rw-권한으로 나열 됩니다 -.
Duncan X Simpson

@ DuncanXSimpson Thanks-권한에 대한 설명을 약간 업데이트했지만이 답변의 setguid 및 sticky 비트를 무시합니다!
Charles Green

8

쉘에서 명령을 호출하는 방법

아니요, 명령이 아닙니다. 쉘이 작동하는 방식은 한 줄의 텍스트를 입력 할 때 첫 단어는 명령으로 취급되며, 명령이 쉘 내장 명령 중 하나가 아닌 경우 쉘은 PATH 환경 변수에 나열된 모든 위치를 봅니다. .

실행하려는 명령이 현재 찾은 디렉토리와 동일한 디렉토리에 있지만 해당 디렉토리가 PATH디렉토리 목록에없는 경우 어떻게됩니까? 그때 당신이 사용해야 ./합니다. 원하는 방식으로 /bin/bash쉘에 전체 경로를 알려주는 것입니다. 그리고 ./의 경우에는 "이 디렉토리를 보라"고 말하는 것입니다. 따라서 중요한 부분은 파일이있는 동일한 디렉토리에 있어야한다는 것입니다.

물론 실제로 실행 파일을 실행하려면 실행 가능 비트가 설정되어 있어야합니다 chmod +x ./my_file.

중요한 단계 :

  1. cd 파일 을 저장위치 ; 그것은에 있다면 ~/Downloads다음,cd ~/Downloads
  2. 실행 chmod +x ./truecrypt-7.2-setup-x86, 이것은 "에 메이크업 파일의 TrueCrypt-7.2-설치-86라고 디렉토리의 실행"
  3. 그리고 지금 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가 요구하는 질문의 핵심 이 아니 었 습니다 .

설명서 및 참조

에서 bash4.3 수동, "명령 실행"섹션 :

이름이 쉘 함수도 아니고 내장도 아니며 슬래시를 포함하지 않는 경우, bash는 PATH의 각 요소에서 해당 이름으로 실행 파일이 들어있는 디렉토리를 검색합니다.

에서 왜 스크립트 이름 앞에 ./ 당신이 필요로하는 (도트 슬래시) 할 떠들썩한 파티에서 실행하는? :

POSIX 는 /를 포함하는 명령 이름을 파일 이름으로 직접 사용하여 $ PATH에서 검색을 억제하도록 지정 하기 때문에 ./와 함께 작동 합니다 . 똑같은 효과를 위해 전체 경로를 사용할 수는 있지만 ./는 더 짧고 쓰기 쉽습니다.


실제로 sudo출력이 잘못되었습니다. 당신이 동일하지 않고 시도 할 경우 sudo, 당신은에서 또 다른 오류가 발생합니다 bash: Permission denied. 그리고을 통해 스크립트를 실행할 수있는 권한을 부여하지 않았으므로 당연히 그렇습니다 chmod +x.
Ruslan

@Ruslan sudo출력이 오해의 소지가 있다는 사실 은 사실이지만 그것이 나타나는 오류입니다. 개발자에게보고해야 할 문제 일 수 있습니다. 그러나 이것이 토론의 핵심은 아닙니다. OP가 이러한 오류를 발생시키기 위해 수행 한 작업을 설정하고 올바른 경로로 안내해야했습니다. 오해의 소지 여부-여기서 문제가 아닙니다.
Sergiy Kolodyazhnyy

다른 방법 으로는 사용하는 것과 정확히 동일 /bin/bash하지 않습니다. 실행 권한이없는 스크립트를 실행할 수 없습니다. 으로 스크립트 이름을 시작 /bin/bash하면 /bin/bash실행 가능한 사실 은 실행 중인 명령이기 때문에 중요 합니다. 그렇게하지 않으면 스크립트 자체가 실행되어 현재 쉘 또는 최상위 #!행에있는 항목으로 연결됩니다
Monty Harder

@MontyHarder /bin/bash는 여기서 예일 뿐입니다. 우리가 호출 /bin/bash하고 실행중인 경로를./script.sh 지정함으로써 사실 은 동일합니다. 와 스크립트를 서문 이나하는 것입니다 완전히 구문이있는 거 전화, 말 쉘이 아닌 다른 뭔가를 작성하면 깰 수있는 방법으로하는 - 당신이 실행 파일을 실행하고 인수로에 스크립트를 통과 서로 다른 주제 . 실행 가능하지만 실제로는 여전히 전체 경로를 지정하고 있습니다. bash script.sh/bin/bash script.shcsh/bin/bash
Sergiy Kolodyazhnyy

2
@SergiyKolodyazhnyy와 스크립트 이름 서문 /bin/bash또는 단지 bash입니다 또한 스크립트에 실행 권한의 부족을 해결하기위한 일반적인 방법. 전체 스크립트 경로를 지정해도 문제가 해결 되지 않습니다 . 그래서 /bin/bash이 특정한 경우에 특히 나쁜 예입니다.
Monty Harder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.