2012-01-24 3 views
1

여기에는 Linux에서 필요한 경로를 내보내는 스크립트가 하나 있습니다. 이 스크립트를 실행 한 후에 다른 스크립트를 실행해야합니다.쉘 스크립트를 실행하는 데 사용되는 두 명령의 차이점은 무엇입니까?

나는 두 개의 스크립트

1 import.sh = importing paths 
2 main.sh = this script do something with HCI (use for Bluetooth purpose). 

내가 ./import.sh을 실행

./main.sh보다 다음 오류를주고있다. 그리고 . ./import.sh을 실행 한 다음 ./main.sh을 실행하면 정상적으로 작동합니다.

./import.sh. ./import.sh 사이의 차이점은 무엇입니까?

수퍼 유저로 스크립트를 실행하면 어떻게됩니까? 수퍼 유저로 실행 스크립트를 사용하는 . ./ 일 수 있습니다.

답변

4

두 호출 차이는 ./import.sh는 import.sh 프로그램으로 실행하고, . ./import.sh는 쉘에 평가된다는 점이다.

"import.sh"가 ELF 프로그램 (셸 스크립트가 아닌 컴파일 된 바이너리) 인 경우 . ./import.sh이 작동하지 않습니다. import.sh 상단 (#!/bin/perl 등)에 오두막이 있다면 당신은 . ./import.sh을 시도하는 경우

, 당신은 불쾌한 놀라움과 오류 메시지의 거대한 번호의 것 - 오두막 현재에 맞게 발생하지 않는 한 껍질을 벗기고, 우연히 작동합니다. 또는 Perl 코드가 어떻게 든 유효한 Bash 스크립트가 될 가능성이있는 경우.

source import.sh과 동일하며 파일에 실행 비트가 설정되어 있지 않아도됩니다 (exec을 통해 생성 된 대신 이미 실행중인 셸에 의해 해석되므로). 나는 이것이 당신의 실수의 근원이라고 생각합니다. 또 다른 차이점은 서브 쉘 대신 현재 쉘에서 ./import.sh이 실행된다는 것입니다. 따라서 내 보낸 환경 변수가 실행에 사용 된 쉘에 영향을줍니다!

그래서 실제로는 다소 다릅니다. 당신이하고있는 일을 알고 그 차이를 이해하지 못한다면 일반적으로 ./import.sh을 원합니다.

+0

. 모든 쉘에서 ./import.sh 효과? – user1089679

0

./import.sh 스크립트를 일반 스크립트 (즉, 서브 쉘)로 실행합니다. 이는 어떤 식 으로든 현재 쉘에 영향을 줄 수 없다는 것을 의미합니다. 가져 오기로되어있는 경로는 현재 쉘에서 설정되지 않습니다.

source에 해당하는 추가 .은 현재 쉘의 컨텍스트에서 스크립트를 실행합니다. 즉, 현재 쉘에서 (설정하려는 경로와 같이) 환경 변수 등을 수정할 수 있습니다 . bash man page :

파일 이름 [인수]
소스파일 이름 [인수]
읽고 현재 쉘 환경에서 파일 이름에서 명령을 실행하고 파일 이름에서 마지막으로 실행 된 명령의 종료 상태를 반환.

+0

이 내보내기 경로 스크립트를 C 프로그램으로 변환하여 시스템 호출을 사용하고 싶습니다. system() 함수를 사용하십시오. 그러나 나는 이것 또한 문제에 직면하고있다. system()이 현재 쉘의 경로를 내 보냅니다. – user1089679

1

./import.sh 새 하위 쉘 셸에서 셸 스크립트를 실행합니다.

. ./import.sh은 현재 쉘에서 셸 스크립트를 실행합니다.
추가 .은 현재 셸을 나타냅니다.

+0

나는이 시스템 경로를 사용하기 위해 C 프로그램으로 내보내기 경로 스크립트를 변환하고 싶다. system() 함수를 사용하십시오. 그러나 나는 이것 또한 문제에 직면하고있다. system()이 현재 쉘의 경로를 내 보냅니다. – user1089679

0

. ./import.sh은 스크립트를 "원본"으로 지정합니다. 단지 ./import.sh으로 실행하면됩니다.

이전 버전에서는 현재 환경을 수정할 수 있습니다. 현재 환경은 나중에 하위 실행 환경에만 영향을 미칩니다.

전자는 (주로 배시 특정 비록)에 상당 :

source ./import.sh 

help source 수율 :

source: source filename [arguments]

현재 쉘 파일에서 명령을 실행한다.

현재 쉘의 FILENAME에서 명령을 읽고 실행하십시오. $ PATH의 항목은 FILENAME이 들어있는 디렉토리를 찾는 데 사용됩니다. ARGUMENTS가 제공되면 FILENAME이 실행될 때 위치 매개 변수 이됩니다.

종료 상태 : FILENAME에서 마지막으로 실행 된 명령의 상태를 반환합니다. FILENAME을 읽을 수없는 경우 실패합니다.

+0

내 주요 블루투스 켜기 명령을 실행 한 후에도 터미널에서 내보내기 명령을 직접 실행했지만 여전히 문제가 있습니다. 왜이 일이 일어 났습니까? – user1089679

관련 문제