`sh` と `source` の違いは何ですか? 質問する

`sh` と `source` の違いは何ですか? 質問する

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または を呼び出す場合.(一方は他方のエイリアスです。sourcecmdは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

見てmycd関数!! (と完了に基づく連想配列)。

実行レベル$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 つの構文間の動作。 ;-)

おすすめ記事