source
or .
(一方は他方のエイリアスです。cmdsource
は POSIX ではありません - bashismのようなものです) を呼び出すと、現在のbash プロセスにbash スクリプトをロードして実行します。だからあなたはできる
- ソーススクリプトに設定された変数を読み取り、
- その中で定義された関数を使用します。
- スクリプトがこれを行う場合は、フォークやサブプロセスも実行します。
を呼び出すと、通常は へのシンボリック リンクであるの新しいセッションを実行するフォーク(サブプロセスまたは子sh
)が開始されます。この場合、サブスクリプトによって設定された環境変数は、サブスクリプトが終了すると削除されます。/bin/sh
bash
注意:別のシェルsh
へのシンボリック リンクである可能性があります。
実用サンプル
たとえば、現在の作業ディレクトリを特定の方法で変更したい場合、これはできませんでした
$ cat <<eof >myCd2Doc.sh
#!/bin/sh
cd /usr/share/doc
eof
$ chmod +x myCd2Doc.sh
これはあなたが期待することをしません:
$ cd /tmp
$ pwd
/tmp
$ ~/myCd2Doc.sh
$ pwd
/tmp
現在の作業ディレクトリは環境の一部であり、サブシェルmyCd2Doc.sh
で実行されるためです。
しかし:
$ cat >myCd2Doc.source <<eof
# Shell source file
myCd2Doc() {
cd /usr/share/doc
}
eof
$ . myCd2Doc.source
$ cd /tmp
$ pwd
/tmp
$ myCd2Doc
$ pwd
/usr/share/doc
mycd
機能を見てください!! ( Associative Arrayに基づくbash補完あり)。
実行レベル$SHLVL
$ cd /tmp
printf %b '\43\41/bin/bash\necho This is level \44SHLVL.\n' >qlvl.sh
$ bash qlvl.sh
This is level 2.
$ source qlvl.sh
This is level 1.
再帰(スクリプトがそれ自体から実行される場合)
$ cat <<eoqlvl2 >qlvl2.sh
#!/bin/bash
export startLevel recursionLimit=5
echo This is level $SHLVL started:${startLevel:=$SHLVL}.
(( SHLVL < recursionLimit )) && ./qlvl2.sh
eoqlvl2
$ chmod +x qlvl2.sh
$ ./qlvl2.sh
This is level 2 started:2.
This is level 3 started:2.
This is level 4 started:2.
This is level 5 started:2.
$ source qlv2.sh
This is level 1 started:1.
This is level 2 started:1.
This is level 3 started:1.
This is level 4 started:1.
This is level 5 started:1.
もう少し
$ sed '$a ps --sid $SID fw' qlvl.sh >qlvl3.sh
$ chmod +x qlvl3.sh
$ export SID
$ read SID < <(ps ho sid $$)
$ echo $SID $$
8983 8983
(現在のPID ( $$
== process Id ) はSID ( session ID ) と同じ識別子です。常に正しいとは限りません。)
$ ./qlvl3.sh
This is level 2.
PID TTY STAT TIME COMMAND
8983 pts/10 Ss 0:00 /bin/bash
10266 pts/10 S+ 0:00 \_ /bin/bash ./qlvl3.sh
10267 pts/10 R+ 0:00 \_ ps --sid 8983 fw
$ . qlvl3.sh
This is level 1.
PID TTY STAT TIME COMMAND
8983 pts/10 Ss 0:00 /bin/bash
10428 pts/10 R+ 0:00 \_ ps --sid 8983 fw
ドット.
は のエイリアスですsource
。したがって、2 つのコマンドの唯一の違いはslash
に置き換えられspace
ます。
そして最終テスト:
$ printf %b '\43\41/bin/bash\necho Ending this.\nsleep 1;exit 0\n' >finalTest.sh
$ bash finalTest.sh
Ending this.
$ source finalTest.sh
Ending this.
... 2 つの構文の動作が異なることに気付くかもしれません。;-)