우리가 사용하는 이유./Linux에서 컴파일된 코드를 실행하기 전에? 컴파일된 코드보다 상위 디렉터리에 있으면 필요하지 않은 것 같습니다. 예를 들어 설명하겠습니다. 내 코드가 있는 경우/홈/이름/코드, 그리고 나도 같은 디렉토리에 있었기 때문에 다음을 사용해야 했습니다../a.출력. 하지만 내가 그렇다면/집/이름/그러면 내가 사용할 수 있어./코드/a.out. 여기서 나는 사용한다./하지만 내 생각에는 코드를 실행해야 한다는 것을 나타내는 것보다 디렉터리를 탐색하는 것이 더 중요하다고 생각합니다. 그렇다면 왜 사용해야합니까?./코드와 동일한 디렉터리에 있는 경우 컴파일된 코드를 실행하시겠습니까?
답변1
명령을 실행할 때 쉘은 전체 경로를 지정하지 않고 명령을 호출할 수 있는 것처럼 보이게 하는 트릭을 사용합니다. 쉘은 환경 변수에 나열된 각 디렉토리에서 명령을 찾고 $PATH
, 발견되면 명령 실행을 예약합니다.
디렉토리 중 하나에 없는 명령을 실행하려면 $PATH
쉘에 파일을 찾을 수 있는 힌트를 제공해야 합니다. 귀하의 예에서는 /home/uname/code
가 에 없기 때문에 $PATH
실행하려는 파일을 찾을 수 있도록 충분한 경로 정보를 쉘에 제공해야 합니다. 이는 현재 작업 디렉터리가 파일이 있는 디렉터리이든 다른 디렉터리이든 마찬가지입니다. 실행하려는 파일과 동일한 디렉토리에 있는 경우 ./
파일 이름 앞에 오는 내용만으로도 쉘에 파일을 찾을 수 있는 위치를 알려주기에 충분합니다.
답변2
셸에 대한 입력은 절대 또는 상대 여부에 관계없이 항상 실행 파일의 경로입니다. 디렉터리 경로/파일 이름으로 구성되어야 합니다. 현재 디렉토리에서 실행 파일 이름만 지정하면 쉘은 입력한 문자열 앞에 자동으로 접두어를 붙입니다 $PATH
. 그렇기 때문에 항상 경로를 입력해야 합니다.
그런데, 귀하의 코드가 에 있고 /home/uname/code/
귀하가 에 있다면 /home/uname/
반드시 사용할 필요는 없습니다.
./코드/a.out그냥 사용할 수도 있습니다
코드/a.out왜냐하면 이 경로도 상대 경로이기 때문입니다.
답변3
실행 파일을 찾을 수 없으면 which
쉘에서도 이를 찾을 수 없습니다.
which ./a.out
작동합니다. which ./code/a.out
실행 파일의 전체 경로를 인쇄하지만 which a.out
.
다른 사람들이 지적했듯이 PATH
문제의 프로그램을 호출하기 전에 환경 변수를 변경하면 작동합니다.
예를 들면 다음과 같습니다 bash
.
[uname@host:/home/uname/code]$ echo $PATH
/usr/bin:/bin
[uname@host:/home/uname/code]$ which a.out
which: no a.out in (/usr/bin:/bin)
[uname@host:/home/uname/code]$ which ./a.out
/home/uname/code/a.out
# add present directory to path
[uname@host:/home/uname/code]$ export PATH="${PWD}:${PATH}"
[uname@host:/home/uname/code]$ echo $PATH
/home/uname/code:/usr/bin:/bin
[uname@host:/home/uname/code]$ which a.out
/home/uname/code/a.out