내 디렉토리의 파일 보기 /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
). zsh
run 을 사용하면 스크립트가 올바르게 실행되지 않을 수 있고 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을 기반으로 파일로 무엇을 할지 결정하도록 하는 대신 실행 비트를 설정할 필요가 없습니다.