私のディレクトリのファイルを見る/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 に基づいてファイルで何をするかを決定させる代わりに、実行ビットを設定する必要はありません。