1. 程式人生 > >Shell Script運行方式的差異

Shell Script運行方式的差異

不存在 files cal fir please 小數點 ash 相對路徑 gif

source, sh script, ./script

不同的script運行方式還造成不一樣的結果!尤其對bash的環境影響很大。通常來說,shell腳本有一下幾種運行方式:

  • 利用直接運行的方式運行script
  • 利用source來運行腳本
  • 利用. 小數點的方式來運行腳本

直接運行script

當使用直接命令運行(不論是絕對路徑/相對路徑還是$PATH內),或者是利用bash(或sh)來運行腳本時,該script都會使用一個新的bash環境來運行腳本內的命令!

也就是說,使用這種運行方式時,其實script實在子程序的bash內運行的!【當子程序完成後,在子程序內的各項變量或動作將會結束而不會傳回父程序中】

以下面的腳本為例:

#!/bin/bash                                                                 
# Program:
#   User inputs his first name and last name. Program shows his full name. #History:
# 2018/10/6 keith   First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
read -p "Please input your first name:" firstname  #提示輸入
read -p "Please input your last name:" lastname #輸入
echo -e "\nYour fullname is:$firstname $lastname" #打印到屏幕

這個交互式腳本可以讓使用者自行配置兩個變量,分別是firstname和lastname,如果直接運行該命令時,會發現script中幫你配置的firstname變量和lastname變量在bash中並沒有返回值,是不存在的。而這兩個變量在script運行中卻是有效的!也就是說,這兩個變量在父程序的bash中並不存在!

事實上,當我們使用直接運行的方式來處理腳本時,系統會給我們一個新的bash讓我們運行sh02.sh裏面的命令,因此sh02.sh中的firstname和lastname等變量其實實在子程序中的bash內運行的。當sh02.sh運行完後,子程序的bash中的所有數據會被移除,因此我們在父程序的bash下echo $firstname 時,就看不到任何返回值了。

技術分享圖片

利用source來運行腳本:在父程序中運行

如果使用source來運行腳本,我們再在父程序的bash中echo $firstname 發現,在腳本中的變臉firstname和lastname 有返回值了!

這是因為source對script的運行會在父程序中運行,因此各項動作都會在原本的bash內生效! 這也是為什麽你在更改玩 .bashrc 的配置後不必註銷系統,只需source ~/.bashrc 就會生效的原因!

技術分享圖片

Shell Script運行方式的差異