현재 디렉토리에서 프로그램을 실행하기 전에 왜`. /`를 입력해야합니까?


92

a.out우분투 터미널을 사용하여 C 프로그램을 실행하는 동안 왜 그냥 쓰는 대신 항상 ./전에 입력해야 합니까? 이것에 대한 해결책이 있습니까?a.outa.out




답변:


119

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에 추가 할 수는 있지만 링크 된 질문에 제공된 이유로 권장하지 않습니다.


25
이. +1 하지 마십시오 추가 .사용자에 PATH(다른 두 답변은 현재 제안으로) 때문에이 답변에 언급 된 보안 위험에.

8
또한 특별한 것이 없다는 것을 지적 가치가있을 수 있습니다 .당신은 실행 예에 전체 또는 상대 경로를 사용할 수 있습니다, 여기가 /home/user/foo/a.out./build/a.out
tobyodavies

@tobyodavies; 실제로 .는 "내 현재 디렉토리"를 의미하므로 사용자가 읽기 및 실행 권한으로 자신을 찾는 디렉토리가 될 수 있기 때문에 특별합니다. 정규화 된 특정 경로를 추가하는 것보다 위험 할 수 있습니다.
워렌 힐

@WarrenHill은 경로에 추가 할 때 매우 다릅니다. 그러나 bash는 구문의 관점에서, .그것은 단지뿐만 아니라 시작할 수있는 단지 경로의 어떤 특별한 지위를 보유 /하고 ./blah그냥 잘 작동 cat이나 grep떠들썩한 프롬프트로.
tobyodavies

@tobyodavies : OK 귀하의 요점을 포함하도록 답변을 편집했습니다.
워렌 힐

24

그 이유는 간단합니다.

현재 디렉토리에 응용 프로그램과 이름이 같은 명령이 있다고 가정하십시오. 그런 다음 셸에서 명령을 실행하면 기본 제공 명령 대신 앱이 호출 됩니다 . 다른 것이 없다면 보안 문제가 될 것입니다.

./셸은 앞에서 사용 하도록 요구함으로써 해당 이름의 내장 명령이 아니라 주어진 이름으로 응용 프로그램을 실행하려고 함을 알고 있습니다.


1
설명이 잘못되어 셸의 내장 명령과 PATH 변수를 통해 액세스 할 수있는 실행 파일간에 차이가 있습니다. 사실 당신의 대답은 내가 읽을수록 더 부정확하다고 느낍니다.
Ahmed Masud

16

./에없는 파일을 $PATH실행하고 현재 디렉토리 (또는 다른 경유 ./home/stefano/script.sh) 의 파일을 실행합니다 . 이제 PATH는 bash가 실행 가능한 프로그램을 전체 경로 (절대)없이 찾을 수있는 모든 위치를 포함하는 환경 변수입니다.

이 분리는 잘못된 파일 실행을 피하기 위해 필요합니다. 즉 ls, 홈 디렉토리에 파일 이 있으면 PATH에 없으면 bash가 실제 파일과 혼동하지 못하게됩니다 ls. PATH 변수는 또한 검색 순서를 정의합니다.

  • 명령을 실행하거나 프로그램이 execsyscall (커널의 특수한 방법, 프로그램 시작 방법) 을 만들려고 할 때 시스템은 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.


2
한가지 주목할 점은 그의 질문은 그가 무언가를 컴파일하고 링크했다는 것을 나타내는 것으로 보이며 gcc, 자동으로 실행 비트를 설정합니다.
Nathan Osman

12

./프로그램을 실행하기 전에 입력해야하는 이유는 무엇 입니까?

터미널에서 응용 프로그램의 이름을 입력 할 때마다 gedit터미널이 응용 프로그램 (응용 프로그램의 이진 파일)을 포함하는 (사전 정의 된) 디렉토리를 찾게됩니다. 이 디렉토리의 이름은이라는 변수에 포함되어 PATH있습니다. 을 실행하여이 변수의 내용을 볼 수 있습니다 echo $PATH. :?로 구분 된 디렉토리를보십시오 . 사람들은 터미널 방금 입력하면 찾아 갈 것 디렉토리이다 gedit, nautilus또는 a.out. 보시다시피, a.out프로그램 의 경로 는 없습니다. 당신이 할 때 ./a.out, 당신은 터미널에게 "현재 디렉토리를보고 실행 a.out하고, 보지 말라고 말하고 PATH있습니다.

해결책 1

./매번 입력하지 않으려면에에 a.out디렉토리 를 추가해야합니다 $PATH. 다음 지침에서는, 나는 경로가 있다고 가정합니다 a.out입니다 /path/to/programs/,하지만 당신은 당신의 실제 경로로 변경해야합니다.

  1. 파일 끝에 다음 줄을 추가하기 만하면됩니다 ~/.pam_environment.

    PATH DEFAULT=${PATH}:/path/to/programs

    출처 : 지속적인 환경 변수

  2. 로그 아웃했다가 다시 로그인하십시오. 이제 디렉토리 a.out없이 실행할 수 있습니다 ./.

다른 디렉토리에 다른 프로그램이 있으면 위의 행에 추가하면됩니다. 그러나 예를 들어 "myPrograms"라는 하나의 디렉토리를 만들고 모든 프로그램을 그 아래에 두는 것이 좋습니다.

해결책 2

참고 :userName 실제 우분투 사용자 이름으로 변경 하십시오.

다른 프로그램을 실행하려면 어떻게해야합니까? 그리고 그들은 모두 다른 폴더에 있습니까? "보다 체계적인"솔루션은 bin홈 디렉토리 아래에 폴더를 만들고 해당 폴더 아래에 심볼릭 링크 (바로 가기)를 추가하는 것입니다. 방법은 다음과 같습니다.

  1. mkdir /home/userName/bin

    • bin홈 디렉토리 아래 에 폴더가 생성됩니다 .
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • 그러면 a.out아래에 프로그램 의 "기호 링크"(기본적으로 바로 가기)가 생성 됩니다 bin.
  3. 로그 아웃했다가 다시 로그인하십시오. 이제 디렉토리 a.out없이 실행할 수 있습니다 ./.

이제 다른 곳에 다른 프로그램이있을 때마다 b.in데스크탑에 프로그램이 있다고 가정 해 봅시다 :. ln -s /home/userName/Desktop/b.in /home/userName/bin그러면 프로그램을 실행하지 않고도 실행할 수 ./있습니다.

참고 : @ Joe 's comment 덕분에 백업을 수행 할 때 심볼릭 링크를 특수하게 처리해야합니다. 기본적으로 rsync전혀 처리하지 않으므로 복원 할 때 존재하지 않습니다.


1
드물게 사용하는 경우 편리한 방법입니다. 많이 사용하면 시스템이 다른 사람이 예상하지 못한 일을하게됩니다. 또한 백업을 수행 할 때 심볼릭 링크를 특수하게 처리해야합니다. 기본적 으로 rsync는 이들을 전혀 처리하지 않으므로 복원 할 때 존재하지 않습니다.
Joe

1

George가 자신의 답변에서 지적한 것처럼 현재 작업 디렉토리에서 파일을 실행 한다는 것을 알 수 있습니다 ( pwd).

나는 오래 전에이 질문을 선배에게 물었던 것을 기억하며, .내가 할 때 a.out현재 디렉토리를보고 그것을 실행할 수 있도록 경로에 추가해야한다고 말했다 . 이 경우에는 할 필요가 없습니다 ./a.out.

그러나 개인적으로 나는 그것을 반대하는 것이 좋습니다. 그것은 나에게 결코 일어나지 않았지만, 외계인 네트워크 디렉토리 나 무언가에 있고 악성 실행 파일이 ls존재한다면 .경로에있는 것은 매우 나쁜 생각입니다. 당신이이 문제를 자주 겪게되는 것은 아닙니다.


좋아, 스테파노는이 정보를 포함하는 그의 대답 :) 채택
Shrikant Sharat을

3
에 추가하지 않는 것에 전적으로 동의 .합니다 $PATH. 매우 위험한 생각입니다.
Nathan Osman

1

다른 답변 외에도 여기에서 man bash그 부분 을 잘 설명하는 필수 부분 이 있습니다.

명령 실행
       명령이 단어로 분리 된 후
       명령 및 선택적 인수 목록은 다음과 같습니다.
       찍은.

       명령 이름에 슬래시가 없으면 쉘은 위치를 찾으려고 시도합니다.
       그것. 해당 이름의 쉘 함수가 있으면 해당 함수는
       FUNCTIONS에 위에서 설명한대로 호출됩니다. 이름이 일치하지 않으면
       쉘은 쉘 내장 목록에서이를 검색합니다. 만약
       일치하는 것이 발견되면 내장이 호출됩니다.

       이름이 쉘 함수 나 내장 함수가 아니며 포함하지 않은 경우
       슬래시, bash는 PATH의 각 요소에서 디렉토리 구성을 검색합니다.
       해당 이름으로 실행 파일을 유지합니다.

0

'./'는 자신에게 알려진 특정 프로그램 (예 : 자신의 프로그램)을 실행할 때 의미가 있습니다. 이 프로그램은 현재 디렉토리에 있어야합니다. './'는 $ PATH에있는 표준 명령을 실행할 때 의미가 없습니다. "실행할 명령"명령은 $ PATH에서 명령 실행 위치를 알려줍니다.


0
$ gcc hello.c -o /path/to/someplace/hello

어떤 위치에서 실행 파일을 생성합니다. 해당 위치가 경로에 있으면 파일을 실행할 수 있습니다. "gcc를 사용하여이 소스 코드를 컴파일하고 경로에있는 특정 위치에 실행 파일을 배치하십시오"조치에 대한 레이블을 작성하려는 경우이를 스크립트 할 수 있습니다.

"testbin"이라는 새로운 디렉토리 나 그런 종류의 디렉토리를 만들어 경로에 넣어 기존 경로 디렉토리를 깨끗하게 유지하는 것이 좋습니다.


0

./불필요한 경로 검색을 제거합니다. ./현재 디렉토리에서만 검색하도록합니다. 우리가 포기하지 않으면 ./다음과 같은 시스템에 설정 다양한 경로를 검색합니다 /usr/bin, /usr/sbin/


0

"./"는 현재 디렉토리에서 파일을 실행하여 전체 경로를 입력 할 수있는 바로 가기를 나타냅니다. 예를 들면 다음과 같습니다.

[root@server ~]#/path/to/file/file.pl

와 동일 :

[root@server file]#./file.pl

이전 예제에서 디렉토리와 해당 디렉토리를 파일 위치로 이동하고 "./"를 사용하여 현재 디렉토리에서 파일을 실행했습니다.

" [root @ server ~] # / path / to / file / file.pl "이전의 파일은 파일 위치로가는 길을 "cd"게으 르면 파일 을 실행합니다.


-4

매우 간단하고 많은 용도가 있습니다.

  1. 동일한 응용 프로그램의 여러 버전이 설치된 경우 다른 경로에서 사용할 수 있지만에서 바이너리에 대한 소프트 링크를 만들 수 있습니다 /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이 실행됩니다. 지정 .하면 현재 폴더의 실행 파일이 사용됩니다.

  1. .-항상 현재 디렉토리에서 실행을 나타냅니다. 그리고 ..항상 이전 디렉토리에서 실행한다는 의미입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.