linux系統shell中調用另外一個腳本的三種不一樣方法(source,exec,fork)

1. fork  ( /directory/script.sh) :若是shell中包含執行命令,那麼子命令並不影響父級的命令,在子命令執行完後再執行父級命令。子級的環境變量不會影響到父級。 shell

fork是最普通的, 就是直接在腳本里面用/directory/script.sh來調用script.sh這個腳本.bash

運行的時候開一個sub-shell執行調用的腳本,sub-shell執行的時候, parent-shell還在。ide

sub-shell執行完畢後返回parent-shell. sub-shell從parent-shell繼承環境變量.可是sub-shell中的環境變量不會帶回parent-shellspa

2. exec (exec /directory/script.sh):執行子級的命令後,再也不執行父級命令。orm

exec與fork不一樣,不須要新開一個sub-shell來執行被調用的腳本.  被調用的腳本與父腳本在同一個shell內執行。可是使用exec調用一個新腳本之後, 父腳本中exec行以後的內容就不會再執行了。這是exec和source的區別繼承

3. source (source /directory/script.sh):執行子級命令後繼續執行父級命令,同時子級設置的環境變量會影響到父級的環境變量。進程

與fork的區別是不新開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行. 因此被調用的腳本中聲明的變量和環境變量, 均可以在主腳本中獲得和使用.ip


能夠經過下面四個腳本體會一下結果:it

1, source_1.sh class

  #!/bin/bash

  echo "source 2.sh begin"

  export a=1

  source ./2.sh

  echo "1.sh b is $b"

  echo "source 2.sh end"

2.  exec_1.sh

  #!/bin/bash

  echo "exec 2.sh begin"

  export a=1

  exec ./2.sh

  echo "1.sh b is $b"

  echo "exec 2.sh end"

3. fork_1.sh

  #!/bin/bash

  echo "fork 2.sh begin"

  export a=1

  sh ./2.sh

  echo "1.sh b is $b"

  echo "fork 2.sh end"

4.  2.sh

 #!/bin/bash

 b=2

 echo "a is $a"

 echo "b is $b"


運行結果是:

  source 會回傳變量值

  fork 不回傳變量

  exec 不回傳變量,執行完本命令結束父進程

相關文章
相關標籤/搜索