./ vs. 터미널에서 프로그램을 실행하기위한 것


13

터미널에서 실행 파일을 실행하는 방법에 대한 설명이 필요합니다. 이 절름발이 질문 할 수 있지만 함께 실행 파일을 실행 사이의 차이는 무엇 ./an_executable. an_executable(의 우리가 an_executable가있는 디렉토리에 있다고 가정하자는)

나는 전자가 쉘이 현재 디렉토리 ( .) 에서 an_ executable을 찾게한다는 것을 이미 알고 있지만 후자 버전을 사용할 때 왜 /필요 하지 .않습니까?

미리 감사드립니다.


답변:


22

. executable구문은 그냥 실행 작업 (또는합니까?)하지 않습니다. 대신 bash source내장 의 별명입니다 . 차이점은 대부분 bash 스크립트와 관련이 있으며 사실은 완전히 다릅니다. :)

./executable실행 파일을 "정상적으로"실행하도록 요청합니다. ./현재 경로에 대한 상대 참조입니다. 이것은 쉘 (bash)이 디렉토리에서 실행 파일을 찾으려고 $PATH하지 않도록합니다 (명령으로 경로를 지정하지 않은 경우). 당신이 할 수없는 이유 executable는 보안 중 하나입니다. 다운로드 한 아카이브의 압축을 풀고의 악성 버전이 포함되어 있다고 상상해보십시오 ls. 현재 디렉토리에서 직접 실행 한 경우 실현하지 않고 해당 버전을 실행합니다.

반면에, . executable"이름이 executable"인 파일을 찾으십시오 . 파일의 이름을 직접 지정하고 실제로 실행 파일 일 필요는 없으므로 $ PATH에 대한 보안 제한이 적용되지 않습니다. 소싱은 쉘 스크립트 만 "실행"하거나 실행하는 것처럼 보입니다. 그것이하는 일은 :

   source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.

그렇다면 ... 실행과 소싱의 차이점은 무엇입니까? 동일한 쉘 스크립트를 가정하고 실행하면 ( ./script) 새 쉘을 생성하고 해당 쉘 내에서 스크립트를 실행하며 스크립트가 종료되면 해당 쉘을 닫고 상위 쉘로 돌아갑니다. 실제로 bash는 스크립트를 실행하기 위해 새 프로세스를 시작합니다 .

( . script)는 현재 쉘이 명령 행에 입력 된 것처럼 파일에서 명령을 읽도록합니다. 새로운 쉘이 생성되지 않습니다.

이 동작을 확인하는 가장 쉬운 방법은을 포함하는 스크립트를 작성하는 것 exit입니다. 그럴 경우 ./script아무 일도 일어나지 않는 것 같습니다. 새 쉘 프로세스가 시작되고 exit명령이 쉘을 종료하고 현재 쉘에 영향을 미치지 않기 때문 입니다.

이면 . script현재 터미널에서 exit명령이 실행 되므로 현재 터미널이 닫힙니다 . 따라서 exit명령 프롬프트 에서 입력 하는 것과 같습니다 .


실제로, 나는이 행동을 발견했을 때 쉘 스크립트를 다루고있었습니다. 정말 감사합니다. 그게 제가 필요한 답입니다. :)
zipzap

또 다른 질문이 발생했습니다 (걱정하지 않는 경우). 내 스크립트에 echo가있는 간단한 메시지가 포함되어 있고 ./script로 실행중인 경우 서브 쉘이 닫히면 왜 상위 쉘에서 메시지를 볼 수 있습니까? 처형이 끝나 자마자?
zipzap

2
서브 쉘은 별도의 프로세스 이지만 호출 쉘 과 동일한 터미널 을 사용합니다 . 여전히 ls출력 을 볼 수있는 방법과 비슷 합니다. 명령을 입력하고 실행하여 출력을 표시 한 다음 종료하지만 출력은 터미널에 남아 있습니다.
roadmr

2
쉘을 터미널과 혼동하지 마십시오. 그들은 다른 것들입니다. 터미널을 열면 터미널 bash안에서 실행 되는 쉘 이 명령 프롬프트를 제공 합니다. 을 입력 bash하면 다른 쉘을 실행하게됩니다 . 첫 번째 셸에는 실행되는 프로그램 일뿐입니다. 을 입력 exit하면 마지막으로 시작한 쉘 이 닫히지 만 여전히 첫 번째 쉘 (터미널을 시작할 때의 쉘)에있게됩니다. 다시 말하지만, 이것은 모두 동일한 터미널 내에서 발생합니다.
roadmr

1
@DavidZ 나는 그것을 언급했다 :) "소싱은 쉘 스크립트를"실행 "(또는 실행하는 것)한다."
roadmr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.