shell腳本的執行方式
首先腳本需要有執行許可權
chmod u+x file.sh
執行腳本有三種方法:
1. ./file.sh
特點:開啟bash子進程來執行,也就是開啟額外的進程來進行,不影響原進程的變數、配置等
2. bash file.sh
特點:和./file.sh相同
3. source file.sh 或者 . file.sh
特點:在原bash進程中執行腳本。
第三種方法主要用於在腳本中切換用戶su、切換目錄cd等命令。
source 和 . 命令是相同的。
你可以搜索 source
補充,如何查看腳本運行是否開啟了bash子進程
1.
vim
file.sh
2.
寫入
#!/bin/bash
#echo
$$命令會輸出bash進程id
echo
$$
3.
保存並賦予可執行許可權chmod
u+x
file.sh
4.
在你的shell中輸入,echo
$$
屏幕輸出4176
5.
./file.sh
屏幕輸出3600
6.
bash
file.sh
屏幕輸出3984
7.
source
file.sh
屏幕輸出4176
和
你直接在shell中輸出的一樣,說明是在同一個bash進程
2. 本地shell腳本中ssh到遠程伺服器並執行命令
在實際運用中在當前伺服器執行命令後,需要在另一台伺服器繼續執行某些命令,和耐衫分開去到另一台伺服器執行也是比較麻煩的,因此整理下集中執行的方式喚腔
1、首先配置ssh免密操作
Linux 下實現SSH互信: https://www.jianshu.com/p/2456d98aa607
2、簡單命令
ssh [email protected] "cd /var/lib; ls; cd "
2.1 使用時注意,雙引號必須有。若沒加雙引號,第二條及之後的命令會在本地執行
2.2 分號是將兩條語句間隔開
2.3 單雙引的區別:單引號不會解析值,是什麼就傳什麼;雙引號會解析值,將解析結果傳過去
3、多條命令
ssh [email protected]<< reallssh
cd /var/lib/test
tar -zxvf api.com.tar.gz
......
exit
reallssh
3.1 命令寫在 << reallssh(開始畝悶) 至 reallssh(結束) 之間
3.2 reallssh可自己定義為其他形式
3.3 在結束前加上exit退出遠程
4、可能遇到的問題
問題:遠程登錄主機時出現Pseudo-terminal will not be allocated because stdin is not a terminal. 錯誤
解決方案:字面意思是偽終端將無法分配,因為標准輸入不是終端。
所以需要增加-t -t參數來強制偽終端分配,即使標准輸入不是終端。
to force pseudo-tty allocation even if stdin isn』t a terminal.
參考樣例如下:
ssh -t -t [email protected] -p 22
--------------------------------------------------------------------------------
參考:https://blog.csdn.net/jinking01/article/details/84386769
3. Linux Shell腳本的執行過程
用戶登錄時,將會取得一個 bash ,這個 bash 在系統中有一個全局唯一的ID,也就是進程的ID,使用命令 ps -ef 並配合 grep 來查看進程ID。 ps -ef|grep bash ,此命令還能查看進程對應的父進程ID,系統中所有進程的祖先進程都是INIT進程(進程ID=1),它是最先啟動運行的。
回到 bash 進程,也就是我們的命令行界面,進程的執行都有其附屬的執行環境,環境變數就屬於其中之一。並且環境變數是可以完全被子進程繼承的,也就是說,子進程可以使用父進程的環境變數,但是不能使用父進程的自定義變數。
簡而言之: 子進程繼承父進程的環境變數,不繼承父進程的自定義變數。
shell腳本有4種執行方式,不同的執行方式可能導致結果不一致
四種方式的執行結果如下:
4. shell腳本的執行都有哪些方法,有何不同
你好!
運行一個Bash腳本的3中方式:
1.為腳本文件加上可執行的許可權:
chmod
+x
script_file
2.運行/bin/bash
命令並且把腳本文件名作為它的參數
3.可在shell腳本中的開頭加上一句:#!/bin/bash,然後在腳本所在目錄
./shellfile
看自己的需求,沒什麼本質的區別。
希望對你有所幫助,望採納。
5. shell腳本程序的執行有哪三種格式
題主你好,
1.點命令.//./script.sh
2.source命令.//sourcescript.sh
3.直接調用腳本解釋器.//bashscript.sh
測試代碼及截圖如下:
希望可以幫到題主,歡迎追問
6. 執行shell腳本的方式主要是什麼
(1)輸入定向到Shell腳本
$ bash < 腳本名
(2)以腳本名作為參數
$ bash 腳本名 〔參數〕
(3)將Shell腳本的許可權設置為可執行,然後在提示符下直接執行它。
$ chmod a+x 腳本名
$ PATH=&PATH:.
$ 腳本名
7. Shell腳本的幾種執行方式之區別
1、bash 腳本文件或者 sh 腳本文件,通過這種方式可以運行沒有執行許可權或者在腳本裡面沒有指定解釋器的腳本;
2、./腳本文件或者腳本文件全路徑,通過這種方式執行腳本文件需要腳本文件有執行許可權,並且在腳本文件裡面指定了正確的解釋器;
3、source 腳本文件或者. 腳本文件(.和腳本文件之間有空格),這種運行方式是在當前shell下運行,運行後腳本中定義的變數不會釋放,這也是此種方式運行腳本與前三種的最大區別。例如在腳本中定義了name=GG,那麼在腳本運行完成之後,echo $name仍會顯示GG
8. 執行shell腳本三種方法的區別:(sh、exec、source)
使用$ sh script.sh執行腳本時,當前shell是父進程,生成一個子shell進程,在子shell中執行腳本。腳本執行完畢,退出子shell,回到當前shell。
./script.sh與 sh script.sh等效。
使用$ source script.sh方式,在當前上下文中執行腳本,不會生成新的進程。腳本執行完畢,回到當前shell。
source方式也叫點命令。
. script.sh與 source script.sh等效。
使用exec command方式,會用command進程替換當前shell進程,並且保持PID不變。執行完畢,直接退出,不回到之前的shell環境。
二、測試驗證
vi loop.sh
顯示當前進程
sh的方式:執行loop.sh列印執行進程
source方式:執行loop.sh列印執行進程
exec方式:執行loop.sh列印執行進程
按下ctrl+C
sh方式:父進程是6770,執行loop.sh時的子進程是13736。執行完畢後回到父進程shell。
source方式:父進程和子進程都是6770(執行時沒有新的進程),執行完畢會回到父進程shell。
exec方式:進程PID沒有改變都是6770,執行完畢(ctrl+C強制關閉)時直接退出了shell。腳本執行時替換了父進程的shell,執行完畢後直接退出,沒有回到之前的shell。
9. linux問題:寫出執行shell腳本的三種方式,寫出samba伺服器的四種安全級別,並寫出他們的
保持樂觀的心態,擁有容忍的態度,該賺錢就賺錢,該玩就玩,該學習就學習,該低調就低調,多鍛煉鍛煉,慢慢會好的。保持樂觀的心態,擁有容忍的態度,該賺錢就賺錢,該玩就玩,該學習就學習,該低調就低調,多鍛煉鍛煉,慢慢會好的。保持樂觀的心態,擁有容忍的態度,該賺錢就賺錢,該玩就玩,該學習就學習,該低調就低調,多鍛煉鍛煉,慢慢會變的更優秀。
10. 如何運行shell腳本
編寫好的shell腳本(如:test),可以採取兩種方式進行運行:
一、 $ sh test
一般不採用這種調用方式,尤其不採用「sh<test」的調用方式,因為這種方式將禁止shell讀取標准輸入。
也可以採用 $ ksh test
這種方式要求shell具有「可讀」的訪問許可權。
二、直接運行可執行的shell腳本之前,首先應使用下列chmod命令,把shell腳本文件設置為可執行的文件。
chmod 755 test(除文件屬主可寫之外,每個用戶均具有讀和可執行的訪問許可權)
chmod +rx test(同上)
chmod u+rx test(只有文件屬主具有讀和執行的訪問許可權)
按照上述要求設置shell腳本文件的訪問許可權後,可採用下列方式,直接運行shell腳本了。
1、test(如果命令檢索路徑包含當前目錄)
2、./test(如果命令減縮路徑不包含當前目錄)
*說明: sh test 方式調用一個shell叫蹦可能會禁止某些shell特定的擴展功能,因而可能引起腳本無法正確執行。