쉘 스크립트는 실행 가능해야 합니까?

쉘 스크립트는 실행 가능해야 합니까?

내 디렉토리의 파일 보기 /etc/profile.d:

cwellsx@DESKTOP-R6KRF36:/etc/profile.d$ ls -l
total 32
-rw-r--r-- 1 root root   96 Aug 20  2018 01-locale-fix.sh
-rw-r--r-- 1 root root 1557 Dec  4  2017 Z97-byobu.sh
-rwxr-xr-x 1 root root 3417 Mar 11 22:07 Z99-cloud-locale-test.sh
-rwxr-xr-x 1 root root  873 Mar 11 22:07 Z99-cloudinit-warnings.sh
-rw-r--r-- 1 root root  825 Mar 21 10:55 apps-bin-path.sh
-rw-r--r-- 1 root root  664 Apr  2  2018 bash_completion.sh
-rw-r--r-- 1 root root 1003 Dec 29  2015 cedilla-portuguese.sh
-rw-r--r-- 1 root root 2207 Aug 27 12:25 oraclejdk.sh

이것은 "WSL(Linux용 Windows 하위 시스템)"의 Ubuntu입니다.

아무튼 oraclejdk.sh내용은 이렇습니다.

export J2SDKDIR=/usr/lib/jvm/oracle_jdk8
export J2REDIR=/usr/lib/jvm/oracle_jdk8/jre
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files/WindowsApps/CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2019.522.0_x64__79rhkp1fndgsc:/snap/bin:/usr/lib/jvm/oracle_jdk8/bin:/usr/lib/jvm/oracle_jdk8/db/bin:/usr/lib/jvm/oracle_jdk8/jre/bin
export JAVA_HOME=/usr/lib/jvm/oracle_jdk8
export DERBY_HOME=/usr/lib/jvm/oracle_jdk8/db

bash 쉘이 시작될 때 실행된다고 확신합니다.

*sh내 질문은 왜 모든 파일에 x권한 비트가 설정되어 있지 않습니까 ? 모든 쉘 스크립트에서 x실행 가능하도록 권한 비트를 설정할 필요는 없나요 ?

저를 초보자라고 생각해주세요.

답변1

쉘 스크립트는 실행될 경우에만 실행 가능해야 합니다.

./scriptname

실행 가능하고 올바른 인터프리터를 가리키는 유효한 라인이 있는 경우 #!해당 인터프리터(예: bash)를 사용하여 스크립트를 실행합니다.

스크립트가아니요실행 가능하지만(여전히 읽을 수 있음) 명령줄에서 명시적 해석기를 사용하여 계속 실행할 수 있습니다.

bash ./scriptname

(스크립트인 경우 bash). zshrun 을 사용하면 스크립트가 올바르게 실행되지 않을 수 있고 bash, bash실행을 사용하면 스크립트가 중단될 수 있으므로 여기에서 어떤 인터프리터가 사용되는지 알아야 합니다 sh(Python이나 Ruby에서 실행하면 Perl 스크립트가 제대로 작동하지 않는 것처럼). .

표시된 것과 같은 일부 스크립트는 실제로는 그렇지 않습니다.스크립트하지만 "도트 스크립트". 이들은 다음을 위해 설계되었습니다.원천, 좋다

. ./scriptname

.즉, dot() 유틸리티 또는 (in bash) 에 대한 인수로 사용됩니다 .

source ./scriptname

(둘은 에서 동일 bash하지만 도트 유틸리티가 더 이식성이 뛰어납니다.)

그러면 현재 환경에서 환경 변수를 설정하는 데 필요한 호출 셸과 동일한 환경에서 도트 스크립트의 명령이 실행됩니다. (정상적으로 작동하는 스크립트는 하위 환경(상위 환경의 복사본)에서 실행되며 환경 변수를 설정하거나 상위 셸에서 현재 디렉터리를 변경할 수 없습니다.)

도트 스크립트는 현재 셸에서 읽혀지므로(또는 "소스에서 가져옴") 실행 가능하지 않아도 되며 읽기만 하면 됩니다.

당신이 보여주고 있는 스크립트는 -line(필요하지 않음)이 없고 #!단지 많은 변수를 내보내기 때문에 도트 스크립트라는 것을 알 수 있습니다.


믿다쉘 매뉴얼에서 "도트 스크립트"라는 용어를 찾았습니다 ksh93. 더 권위 있는 소스를 찾을 수는 없지만 .이 명령을 사용하여 가져와야 하는 스크립트를 설명하는 데는 좋은 단어인 것 같습니다.

답변2

x쉘 스크립트는 직접 실행되기 전에 권한 비트를 설정 해야 합니다 . 예를 들어

 ./myscript.sh 

이 파일을 생성하고 chmod +x를 수행하지 않으면 예상한 대로 권한 거부 오류가 발생합니다.

그러나 파일에 실행 가능한 비트가 설정되어 있지 않다고 가정합니다. 다음 명령을 계속 실행할 수 있으며, 그러면 결국 스크립트가 실행됩니다.

sh ./myscript.sh 

또는

 bash ./myscript.sh 

(터미널에서 시도해 볼 수 있습니다. 실제로 실행하려면 파일에 대한 읽기 권한만 있으면 됩니다.)

본질적으로, 귀하가 자신의 통역사를 제공하는 경우입니다. sh myscript.sh 커널이 shebang을 기반으로 파일로 무엇을 할지 결정하도록 하는 대신 실행 비트를 설정할 필요가 없습니다.

관련 정보