sh
との違いは何ですかsource
?
source: source filename [arguments]
Read and execute commands from FILENAME and return. The pathnames
in $PATH are used to find the directory containing FILENAME. If any
ARGUMENTS are supplied, they become the positional parameters when
FILENAME is executed.
そしてman sh
:
NAME
bash - GNU Bourne-Again SHell
SYNOPSIS
bash [options] [file]
COPYRIGHT
Bash is Copyright (C) 1989-2004 by the Free Software Foundation, Inc.
DESCRIPTION
Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates
useful features from the Korn and C shells (ksh and csh).
Bash is intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
ベストアンサー1
source
または を呼び出す場合.
(一方は他方のエイリアスです。source
cmdはPOSIXではない - ちょっとバシズム)では、シェルスクリプトをロードして実行する。に現在シェルプロセス。 だからあなたはできる
- ソーススクリプトに設定された変数を読み取ります。
- その中で定義された関数を使用します。
- スクリプトがこれを行う場合は、フォークやサブプロセスも実行します。
を呼び出すと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
、サブシェル。
しかし:
$ source ~/myCd2Doc.sh
$ pwd
/usr/share/doc
関数を宣言する場合も同様です:
$ cat >~/myCd2Doc.source <<eof
# Shell source file
myCd2Doc() {
cd /usr/share/doc
}
eof
$ . ~/myCd2Doc.source
$ cd /tmp
$ pwd
/tmp
$ myCd2Doc
$ pwd
/usr/share/doc
実行レベル$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
( 現在ピッド($$
==プロセスID)は、シド(セッション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.\nsle' \
'ep 1;exit 0\n' >finalTest.sh
$ bash finalTest.sh
Ending this.
$ source finalTest.sh
Ending this.
...あなたは気づくかもしれません違う2 つの構文間の動作。 ;-)