1. 程式人生 > >Linux sh與bash 細微差別(運維必備)

Linux sh與bash 細微差別(運維必備)

在shell指令碼的開頭往往有一句話來定義使用哪種sh直譯器來解釋指令碼。
目前研發送測的shell指令碼中主要有以下兩種方式:
(1) #!/bin/sh
(2) #!/bin/bash
在這裡求教同福客棧的各位大俠們一個問題:
以上兩種方式有什麼區別?對於指令碼的實際執行會產生什麼不同的影響嗎?

指令碼test.sh內容:
#!/bin/sh
source pcy.sh #pcy.sh並不存在
echo hello
執行./test.sh,螢幕輸出為:
./test.sh: line 2: pcy.sh: No such file or directory
由此可見,在#!/bin/sh的情況下,source不成功,不會執行source後面的程式碼。
修改test.sh指令碼的第一行,變為#!/bin/bash,再次執行./test.sh,螢幕輸出為:
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可見,在#!/bin/bash的情況下,雖然source不成功,但是還是運行了source後面的echo語句。
但是緊接著我又試著運行了一下sh ./test.sh,這次螢幕輸出為:
./test.sh: line 2: pcy.sh: No such file or directory
表示雖然指令碼中指定了#!/bin/bash,但是如果使用sh 方式執行,如果source不成功,也不會執行source後面的程式碼。

為什麼會有這樣的區別呢?

junru同學作了解釋

1. sh一般設成bash的軟鏈


[[email protected] cy]$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
2. 在一般的linux系統當中(如redhat),使用sh呼叫執行指令碼相當於打開了bash的POSIX標準模式
3. 也就是說 /bin/sh 相當於 /bin/bash --posix
所以,sh跟bash的區別,實際上就是bash有沒有開啟posix模式的區別

so,可以預想的是,如果第一行寫成 #!/bin/bash --posix,那麼指令碼執行效果跟#!/bin/sh是一樣的(遵循posix的特定規範,有可能就包括這樣的規範:“當某行程式碼出錯時,不繼續往下解釋”)

例如:
[[email protected] yuhj]# head -n1 x.sh 
#!/bin/sh
[[email protected] yuhj]# ./x.sh 

./x.sh: line 8: syntax error near unexpected token `<'
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done < <(route -n)'
[[email protected] yuhj]# 



[[email protected] yuhj]# head -n1 x.sh 
#!/bin/bash


[[email protected] yuhj]#./x.sh 

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.202.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.202.2 0.0.0.0 UG 0 0 0 eth0
Number of lines read = 4
[[email protected] yuhj]# 


[[email protected] yuhj]# head -n1 x.sh 
#!/bin/bash --posix
[[email protected] yuhj]# 
[[email protected] yuhj]# ./x.sh 

./x.sh: line 8: syntax error near unexpected token `<'
./x.sh: line 8: ` while read line; do { echo $line;((Lines++)); } ; done < <(route -n)'



[[email protected] yuhj]# whereis sh bash
sh: /bin/sh /usr/share/man/man1/sh.1.gz /usr/share/man/man1p/sh.1p.gz
bash: /bin/bash /usr/share/man/man1/bash.1.gz

[[email protected] yuhj]# ll /bin/sh /bin/bash
-rwxr-xr-x 1 root root 735004 May 25 2008 /bin/bash
lrwxrwxrwx 1 root root 4 Jan 29 00:39 /bin/sh -> bash
[[email protected] yuhj]# 

轉自:http://yhj1065.blog.163.com/blog/static/19800217201012565235456/

相關推薦

Linux shbash 細微差別必備

在shell指令碼的開頭往往有一句話來定義使用哪種sh直譯器來解釋指令碼。 目前研發送測的shell指令碼中主要有以下兩種方式: (1) #!/bin/sh (2) #!/bin/bash 在這裡求教同福客棧的各位大俠們一個問題: 以上兩種方式有什麼區別?對於指令碼的實際

python基礎—字符串處理、文件處理必備

python open string 字符串處理 文件處理 小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------謝謝您的參考,如有疑問,歡迎交流一、 字

Jenkins用HTTP Request Plugin插件進行網站的監控/加探針監控

pla .org 需要 技術 通知 動作 設置 特定 name 使用的插件: 【HTTP Request Plugin】 思路: 說明:只能是網站是否正常打開,而不能是這個網站業務是否正常,如果是後者,則需要寫特定的接口進行請求處理。 1、通過插件,發送GET請求指定的UR

PHP全棧工程師實戰經驗

php工程師在工作中經常遇到環境配置問題,本文主要通過Centos7 中的yum對環境Nginx+Php+MySQL環境的搭建與配置,希望給看到這篇文章的同學節省一些時間。同時也能為還不清楚如何搭建環境的同學提供一個搭建的思路。文章中的技術要點不是很全面,可根據思路自己拓展技術點。

PHP全棧工程師實戰小技巧

php工程師在工作中經常遇到環境配置問題,本文主要通過Centos7 中的yum對環境Nginx+Php+MySQL環境的搭建與配置,希望給看到這篇文章的同學節省一些時間。同時也能為還不清楚如何搭建環境的同學提供一個搭建的思路。文章中的技術要點不是很全面,可根據

Linux同步相互排斥應用:基礎概念

使用 line 關系 並發執行 來看 文章 必須 生產者 而且 【版權聲明:尊重原創,轉載請保留出處:blog.csdn.net/shallnet 或 .../gentleliu,文章僅供學習交流,請勿用於商業用途】 當操作系統進入多道批處理

linux常用命令用到

inux mkdir 依賴包 文件夾 查看當前目錄 磁盤 rpm kill -9 新建 0、基礎命令 pwd 查看當前目錄 ls 查看當前目錄所有文件夾和文件 mkdir 新建目錄 mkdir -p a/b/c 創建多級目錄 touch 新建文件 cat 查看文件 c

Linux內核設計實現 總結筆記第四章進程調度

什麽 原則 好的 nic 調度系統 相交 中間 使用 就是 進程調度 調度程序負責決定將哪個進程投入運行,何時運行以及運行多長時間。 調度程序沒有太復雜的原理,最大限度地利用處理器時間的原則是,只要有可以執行的進程,那麽就總會有進程正在執行。 多任務 多任務系統可以劃分

linuxc的學習2018.11.11

工程管理器make(續) 偽目標【沒有依賴,只有執行動作】 .PHONY:clean //宣告偽目標 clean: rm -f hello main.o func1.o func2.o 執行偽目標: make clean 不取名為makefile的執行方式: make -f 檔

Linux核心設計實現 總結筆記第五章系統呼叫

系統呼叫 核心提供了使用者程序和核心互動的介面,使得應用程式可以受限制的訪問硬體裝置。 提供這些介面主要是為了保證系統穩定可靠,避免應用程式恣意妄行。   一、核心通訊 系統呼叫在使用者空間程序和硬體裝置之間新增中間才能。作用有三: 為使用者空間提供一種硬體的抽象介面。無需理會物理

Linux內核設計實現 總結筆記第五章系統調用

總結筆記 其余 筆記 運行 six 應用 osi 虛擬系統 抽象接口 系統調用 內核提供了用戶進程和內核交互的接口,使得應用程序可以受限制的訪問硬件設備。 提供這些接口主要是為了保證系統穩定可靠,避免應用程序恣意妄行。 一、內核通信 系統調用在用戶空間進程和硬件設備之間

Linux核心設計實現 總結筆記第六章核心資料結構

核心資料結構 Linux核心實現了這些通用資料結構,而且提倡大家在開發時重用。 核心開發者應該儘可能地使用這些資料結構,而不要自作主張的山寨方法。 通用的資料結構有以下幾種:連結串列、佇列、對映和二叉樹   一、連結串列 1.1 單向連結串列和雙向連結串列   1.2 環形

shbash執行語法嚴謹問題

在Linux中,我們知道有幾種方式可以執行.sh指令碼 通過sh或者bash命令來執行 通過source來執行 通過./xxx.sh來執行(這種方式要求對指令碼檔案有r和x許可權才行) 今天在寫指令

Linux下安裝解除安裝工具三種方法

三種方法為:rpm工具、yum工具、原始碼包 rpm工具(操作繁瑣) 光碟機掛載到mnt:mount /dev/cdrom /mnt/centos安裝包中就有rpm包 Packages rpm -ivh rpm包檔案 //安裝rpm -Uvh rpm包檔案 //升級rpm -e 包名 //解除安裝(包名

Linux下安裝卸載工具三種方法

ado 路徑 sha ins nag 查詢 linu ext 光驅掛載 三種方法為:rpm工具、yum工具、源碼包 rpm工具(操作繁瑣) 光驅掛載到mnt:mount /dev/cdrom /mnt/centos安裝包中就有rpm包 Packages rpm -ivh

機器人的思維區別機器人的差別根本在哪裡?

人與機器人的差別根本在哪裡?就是記憶的儲存和對儲存內容的組合與配比中。人的記憶,最根本的就是把曾經見過的東西儲存起來。把現實中的東西,通過"列舉方法"與儲存的內容相配比,當對應在一起時,就認為可以實現確認。   關鍵因素是記憶與現實的量化和抽象。比如我們。我之所以能認識你

VMWare虛擬機器安裝CentOS 7 Linux及HadoopEclipse學習環境1-虛擬機器

1. 建立CentOS Linux虛擬機器   VMware Player (現已更名為VMware Workstation Player)是一款桌面虛擬化應用,無需重新啟動即可在同一計算機上執行一個或多個作業系統。(現已經推出免費的 VMWare Works

《鳥哥的Linux私房菜 基礎學習篇第三版》習題解析

第四部分 Linux使用者管理 第14章 Linux賬號管理與ACL許可權設定 ·root的UID與GID是多少?基於這個理由,我要讓test這個賬號具有root的許可權,應該怎麼做? 答:root的UID與GID都是0,UID只有0和非0兩種,0代表系統管理員。所以要讓t

例說linux核心應用資料通訊:對映裝置核心空間到使用者態

#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #incl

例說linux核心應用資料通訊:proc虛擬檔案系統

下面是一個簡單使用proc的示例,應用上面傳入資料,核心經過處理之後,應用再獲取經過處理的資料:#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <