シェルスクリプトは実行可能でなければなりませんか?

シェルスクリプトは実行可能でなければなりませんか?

私のディレクトリのファイルを見る/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。より権威のあるソースを見つけることはできませんが、.このコマンドを使用してインポートする必要があるスクリプトを説明するのに良い言葉のようです。

おすすめ記事