a.out
우분투 터미널을 사용하여 C 프로그램을 실행하는 동안 왜 그냥 쓰는 대신 항상 ./
전에 입력해야 합니까? 이것에 대한 해결책이 있습니까?a.out
a.out
a.out
우분투 터미널을 사용하여 C 프로그램을 실행하는 동안 왜 그냥 쓰는 대신 항상 ./
전에 입력해야 합니까? 이것에 대한 해결책이 있습니까?a.out
a.out
답변:
a.out
시스템 과 같은 프로그램 이름을 입력하면 PATH에서 파일을 찾습니다. 내 시스템에서 PATH는
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
아마도 당신과 비슷할 것입니다. 확인하려면 echo $PATH
터미널에 입력하십시오 .
시스템은 주어진 순서대로 이러한 디렉토리를 살펴보고 프로그램을 찾을 수 없으면 command not found
오류가 발생합니다.
명령 앞에 ./
"PATH를 잊어 버렸습니다. 현재 디렉토리에서만 보시길 바랍니다 "라고 말합니다.
마찬가지로 다음과 같이 상대 또는 절대 경로를 명령 앞에 추가하여 시스템이 다른 특정 위치 만 찾도록 할 수 있습니다.
../
부모 디렉토리에있는 의미 ../hello
.
./Debug/hello
: " hello
현재 디렉토리의 디버그 서브 디렉토리를 찾으십시오 ."
또는 /bin/ls
: " ls
디렉토리에서 찾기 /bin
"
기본적으로 현재 디렉토리는 보안 위험으로 간주되므로 경로에 없습니다. 이유를 참조하십시오 . 기본적으로 경로에 없습니까? 왜 수퍼 유저에서.
현재 디렉토리를 PATH에 추가 할 수는 있지만 링크 된 질문에 제공된 이유로 권장하지 않습니다.
.
사용자에 PATH
(다른 두 답변은 현재 제안으로) 때문에이 답변에 언급 된 보안 위험에.
.
당신은 실행 예에 전체 또는 상대 경로를 사용할 수 있습니다, 여기가 /home/user/foo/a.out
나./build/a.out
.
는 "내 현재 디렉토리"를 의미하므로 사용자가 읽기 및 실행 권한으로 자신을 찾는 디렉토리가 될 수 있기 때문에 특별합니다. 정규화 된 특정 경로를 추가하는 것보다 위험 할 수 있습니다.
.
그것은 단지뿐만 아니라 시작할 수있는 단지 경로의 어떤 특별한 지위를 보유 /
하고 ./blah
그냥 잘 작동 cat
이나 grep
떠들썩한 프롬프트로.
그 이유는 간단합니다.
현재 디렉토리에 응용 프로그램과 이름이 같은 명령이 있다고 가정하십시오. 그런 다음 셸에서 명령을 실행하면 기본 제공 명령 대신 앱이 호출 됩니다 . 다른 것이 없다면 보안 문제가 될 것입니다.
./
셸은 앞에서 사용 하도록 요구함으로써 해당 이름의 내장 명령이 아니라 주어진 이름으로 응용 프로그램을 실행하려고 함을 알고 있습니다.
./
에없는 파일을 $PATH
실행하고 현재 디렉토리 (또는 다른 경유 ./home/stefano/script.sh
) 의 파일을 실행합니다 . 이제 PATH는 bash가 실행 가능한 프로그램을 전체 경로 (절대)없이 찾을 수있는 모든 위치를 포함하는 환경 변수입니다.
이 분리는 잘못된 파일 실행을 피하기 위해 필요합니다. 즉 ls
, 홈 디렉토리에 파일 이 있으면 PATH에 없으면 bash가 실제 파일과 혼동하지 못하게됩니다 ls
. PATH 변수는 또한 검색 순서를 정의합니다.
exec
syscall (커널의 특수한 방법, 프로그램 시작 방법) 을 만들려고 할 때 시스템은 PATH의 각 디렉토리를 통해 파일을 찾습니다. 프로그램이 여러 디렉토리에 있더라도 프로그램이 발견되면 검색이 중단되고 발견 된 첫 번째 프로그램이 실행됩니다.파일을 실행하려면 권한에서 실행 비트를 설정해야합니다.
이미 명령 행에 있으므로을 입력하면 chmod +x finename
됩니다.
또는 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하여 권한을 설정할 수 있습니다 .
이제 파일을 PATH의 디렉토리 중 하나에 복사하여 어느 디렉토리에 있고 사용자별로 설정되어 있는지 확인할 수 있습니다 echo $PATH
.
stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
당신은 실행 파일을 생성하는 경우 cat
, 그리고 그것은으로 이동 /usr/local/sbin
, 대신 적절한의 실행 cat
에 상주하는 /bin
. type cat
및 을 사용하여 파일의 위치를 찾을 수 있습니다 whereis cat
.
gcc
, 자동으로 실행 비트를 설정합니다.
./
프로그램을 실행하기 전에 입력해야하는 이유는 무엇 입니까?터미널에서 응용 프로그램의 이름을 입력 할 때마다 gedit
터미널이 응용 프로그램 (응용 프로그램의 이진 파일)을 포함하는 (사전 정의 된) 디렉토리를 찾게됩니다. 이 디렉토리의 이름은이라는 변수에 포함되어 PATH
있습니다. 을 실행하여이 변수의 내용을 볼 수 있습니다 echo $PATH
. :
?로 구분 된 디렉토리를보십시오 . 사람들은 터미널 방금 입력하면 찾아 갈 것 디렉토리이다 gedit
, nautilus
또는 a.out
. 보시다시피, a.out
프로그램 의 경로 는 없습니다. 당신이 할 때 ./a.out
, 당신은 터미널에게 "현재 디렉토리를보고 실행 a.out
하고, 보지 말라고 말하고 PATH
있습니다.
./
매번 입력하지 않으려면에에 a.out
디렉토리 를 추가해야합니다 $PATH
. 다음 지침에서는, 나는 경로가 있다고 가정합니다 a.out
입니다 /path/to/programs/
,하지만 당신은 당신의 실제 경로로 변경해야합니다.
파일 끝에 다음 줄을 추가하기 만하면됩니다 ~/.pam_environment
.
PATH DEFAULT=${PATH}:/path/to/programs
출처 : 지속적인 환경 변수
로그 아웃했다가 다시 로그인하십시오. 이제 디렉토리 a.out
없이 실행할 수 있습니다 ./
.
다른 디렉토리에 다른 프로그램이 있으면 위의 행에 추가하면됩니다. 그러나 예를 들어 "myPrograms"라는 하나의 디렉토리를 만들고 모든 프로그램을 그 아래에 두는 것이 좋습니다.
참고 :
userName
실제 우분투 사용자 이름으로 변경 하십시오.
다른 프로그램을 실행하려면 어떻게해야합니까? 그리고 그들은 모두 다른 폴더에 있습니까? "보다 체계적인"솔루션은 bin
홈 디렉토리 아래에 폴더를 만들고 해당 폴더 아래에 심볼릭 링크 (바로 가기)를 추가하는 것입니다. 방법은 다음과 같습니다.
mkdir /home/userName/bin
bin
홈 디렉토리 아래 에 폴더가 생성됩니다 .ln -s /path/to/programs/a.out /home/userName/bin
a.out
아래에 프로그램 의 "기호 링크"(기본적으로 바로 가기)가 생성 됩니다 bin
.로그 아웃했다가 다시 로그인하십시오. 이제 디렉토리 a.out
없이 실행할 수 있습니다 ./
.
이제 다른 곳에 다른 프로그램이있을 때마다 b.in
데스크탑에 프로그램이 있다고 가정 해 봅시다 :. ln -s /home/userName/Desktop/b.in /home/userName/bin
그러면 프로그램을 실행하지 않고도 실행할 수 ./
있습니다.
참고 : @ Joe 's comment 덕분에 백업을 수행 할 때 심볼릭 링크를 특수하게 처리해야합니다. 기본적으로
rsync
전혀 처리하지 않으므로 복원 할 때 존재하지 않습니다.
George가 자신의 답변에서 지적한 것처럼 현재 작업 디렉토리에서 파일을 실행 한다는 것을 알 수 있습니다 ( pwd
).
나는 오래 전에이 질문을 선배에게 물었던 것을 기억하며, .
내가 할 때 a.out
현재 디렉토리를보고 그것을 실행할 수 있도록 경로에 추가해야한다고 말했다 . 이 경우에는 할 필요가 없습니다 ./a.out
.
그러나 개인적으로 나는 그것을 반대하는 것이 좋습니다. 그것은 나에게 결코 일어나지 않았지만, 외계인 네트워크 디렉토리 나 무언가에 있고 악성 실행 파일이 ls
존재한다면 .
경로에있는 것은 매우 나쁜 생각입니다. 당신이이 문제를 자주 겪게되는 것은 아닙니다.
.
합니다 $PATH
. 매우 위험한 생각입니다.
다른 답변 외에도 여기에서 man bash
그 부분 을 잘 설명하는 필수 부분 이 있습니다.
명령 실행 명령이 단어로 분리 된 후 명령 및 선택적 인수 목록은 다음과 같습니다. 찍은. 명령 이름에 슬래시가 없으면 쉘은 위치를 찾으려고 시도합니다. 그것. 해당 이름의 쉘 함수가 있으면 해당 함수는 FUNCTIONS에 위에서 설명한대로 호출됩니다. 이름이 일치하지 않으면 쉘은 쉘 내장 목록에서이를 검색합니다. 만약 일치하는 것이 발견되면 내장이 호출됩니다. 이름이 쉘 함수 나 내장 함수가 아니며 포함하지 않은 경우 슬래시, bash는 PATH의 각 요소에서 디렉토리 구성을 검색합니다. 해당 이름으로 실행 파일을 유지합니다.
./
불필요한 경로 검색을 제거합니다. ./
현재 디렉토리에서만 검색하도록합니다. 우리가 포기하지 않으면 ./
다음과 같은 시스템에 설정 다양한 경로를 검색합니다 /usr/bin
, /usr/sbin/
등
"./"는 현재 디렉토리에서 파일을 실행하여 전체 경로를 입력 할 수있는 바로 가기를 나타냅니다. 예를 들면 다음과 같습니다.
[root@server ~]#/path/to/file/file.pl
와 동일 :
[root@server file]#./file.pl
이전 예제에서 디렉토리와 해당 디렉토리를 파일 위치로 이동하고 "./"를 사용하여 현재 디렉토리에서 파일을 실행했습니다.
" [root @ server ~] # / path / to / file / file.pl "이전의 파일은 파일 위치로가는 길을 "cd"게으 르면 파일 을 실행합니다.
매우 간단하고 많은 용도가 있습니다.
/usr/bin
. 예를 들어 Python 2.7, Python 2.6이 설치되어 있지만 / usr / bin / python-> python2.7 / usr / local / bin / python-> python2.6경로에 /usr/local/bin
있고 Python을 실행하면 항상 Python 2.7이 실행됩니다. 지정 .
하면 현재 폴더의 실행 파일이 사용됩니다.
.
-항상 현재 디렉토리에서 실행을 나타냅니다. 그리고 ..
항상 이전 디렉토리에서 실행한다는 의미입니다.