1. 程式人生 > >關於#!/bin/sh 和 #!/bin/bash 的差別

關於#!/bin/sh 和 #!/bin/bash 的差別

昨天在看國嵌視訊的時候學到shell指令碼程式設計時候,看到#!/bin/sh和#!/bin/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的特定規範,有可能就包括這樣的規範:“當某行程式碼出錯時,不繼續往下解釋”)

相關推薦

關於#!/bin/sh #!/bin/bash差別

昨天在看國嵌視訊的時候學到shell指令碼程式設計時候,看到#!/bin/sh和#!/bin/bash,雖然有用排除法來嘗試過一些程式,觀察執行結果,可是因為學嵌入式才幾天所以還找不到規律。百度了一下看到了這樣的博文,覺得比較合理。現在貼上來,作為個人筆記的問題的答案。 在shell指令碼的開頭往往有一句

#!/bin/sh與#!/bin/bash的區別

shell學習 clas 基礎 not text 類型 css roo 快的 Linux 中的 shell 有很多類型,其中最常用的幾種是: Bourne shell (sh)、C shell (csh) 和 Korn shell (ksh), 各有優缺點。Bourne

mips交叉編譯環境出現/bin/sh: 1: /bin/gawk/: not found

昨天交叉編譯器是安裝好了,但是在測試編譯的時候出現了個錯誤,找了一下午沒找到,然後早上終於找到了原因以及解決辦法。 錯誤提示意思是沒找到gawk,而我昨天已經安裝了gawk,然後通過命令type gawk可以得到結果gawk is hashed (/usr/b

Linux shell指令碼開頭#!/bin/bash#!/bin/sh介紹與區別

一直以為在Linux shell指令碼中#都是代表著註釋功能,同樣在指令碼開始的#!/bin/sh也只是告訴使用者這是一個shell指令碼,最近查了下,才發現不是這個意思,分享下。 一、意思 #!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面跟的是此解釋此指令碼的she

#!/bin/bash#!/bin/sh的區別,source命令exec命令

Linux指令碼開頭#!/bin/bash和#!/bin/sh是什麼意思以及區別 一、含義 #!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面根的是此解釋此指令碼的shell的路徑。 其實第一句的#!是對指令碼的直譯器程式路徑,指令碼的內

#!/bin/bash#!/bin/sh是什麼意思以及區別

尊重原著,著明:本帖為優秀的帖子整合一、意思#!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面根的是此解釋此指令碼的shell的路徑。 其實第一句的#!是對指令碼的直譯器程式路徑,指令碼的內容是由直譯器解釋的,我們可以用各種各樣的直譯器來

-bash: ./start.sh: /bin/sh^M: bad interpreter: No such file or directory 錯誤解決方案

問題描述:寫linux指令碼時。sh檔案中,在win環境下,編輯了.sh檔案,然後上傳到linux伺服器中,出現如下錯誤: -bash: ./start.sh: /bin/sh^M: bad interpreter: No such file or direc

shell指令碼報錯:-bash: xxx: /bin/sh^M: bad interpreter: No such file or directory

今天寫了一個shell指令碼,然後在執行的時候報錯,指令碼內容很簡單,僅供測試: Shell程式碼   #!/bin/sh   echo "test shell "   具體報錯資訊如下: Shell程式碼   [root@localhost test]# ./test.sh    -b

Linux用戶管理之使用/bin/false/usr/sbin/nologin拒絕用戶登錄及其功能分析(轉)

其他 spa 狀態 roo 服務器 linux用戶 密碼 targe let /bin/nologin,/bin/false的意思是禁止某個用戶登錄。 比較常用的用法: #添加一個不能登錄的用戶 useradd -d /usr/local/apache -g ap

SVN如何忽略dll文件bin目錄

out 配置 出現 客戶端 per 生效 文件 彈出窗口 文件和目錄 一般來說,編譯之後的結果文件都會放在bin目錄下。用svn做代碼管理服務器的時候,肯定不希望編譯的結果文件也簽入進去,因此需要在客戶端配置。 在checkout目錄下,在svn的子菜單中 Properti

【轉載】關於Python腳本開頭兩行的:#!/usr/bin/python# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型

ron 標識 精確 log 解析器 開始 html weight .org 下面的內容來自:http://www.cnblogs.com/blueskylcc/p/5332642.html, 對方也是轉的,不過沒有找到轉載的出處; 1、#!/usr/bin/python

xcodebuild構建時報錯unknown error -1=ffffffffffffffff Command /bin/sh failed with exit code 1

https build stack com lds turned top ngs targe CI今日構建時報出如下錯誤: /Users/xxx/Library/Developer/Xcode/DerivedData/Snowball-ebllohyukujrncba

linux sh腳本異常:/bin/sh^M:bad interpreter: No such file or directory

技術 異常 logs 信息 ima 轉換 linux中 bin ges 在Linux中執行.sh腳本,異常/bin/sh^M: bad interpreter: No such file or directory。這是不同系統編碼格式引起的:在windows系統中編輯的.s

sh腳本異常:/bin/sh^M:bad interpreter: No such file or directory

int 腳本 file bsp 字符 IT director linux inter 轉自:http://www.cnblogs.com/pipelone/archive/2009/04/17/1437879.html 在Linux中執行.sh腳本,異常/bin/sh^

centos 上docker 運行出現/bin/sh: . not found

oos dock 編譯 uil 文件名 src nbsp .... ble 本人用的是Linux上的編譯的....然後用了win上的編譯命令 解決辦法 : 用Linux上的編譯命令..... CGO_ENABLED=0 GOOS=linux GOARCH=amd

Python頭部2行 #!/usr/bin/python #!/usr/bin/env 的區別 以及編碼方式的指定 2018-10-23

htm ron http 聲明 strong 命令 正則表達 cnblogs 用處 參考文檔 【整理】關於Python腳本開頭兩行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件編碼類型 Python 頭部 #!/u

【Python】#!/usr/bin/python #!/usr/bin/env

大部分python檔案的頭部都會寫上 #!/usr/bin/python 或者 #!/usr/bin/env ,這個語句主要和執行模式有關, 如果我們用普通執行模式例如(linux) : python *.py 那麼這個語句在此執行模式下無效。如果想讓python程式像普通程

嵌入式開發中 make 出現錯誤 /bin/sh: -c: 行 0: 未預期的符號 `(' 附近有語法錯誤

  這是因為在Makefile檔案中 包含了帶有中文的檔案路徑  只需要把中文路徑名改成英文就OK啦  /bin/sh: -c: 行 0: 未預期的符號 `(' 附近有語法錯誤/bin/sh: -c: 行 0: `make -C /mnt/yaffs/UP4/

關於linux make時出現錯誤 /bin/sh: 1: Syntax error: "(" unexpected

       當用make去編譯Makefile檔案的時候,如果有出現/bin/sh: Syntax error: 的錯誤時候,一般是當前預設的shell不正確的原因        首先可以用命令ls -l /

MAC 下如何合併.cue .bin 檔案成為 .ISO

mac 下使用 bchunk 合併 .cue 和 .bin 有的時候我們下載下來的磁碟映象很可能是.cue 和.bin 兩個檔案的,在windows下掛載的辦法喝多,各種虛擬磁碟工具就不多介紹了,那麼在mac 如何掛載這樣的檔案? 我給出的答案是必須轉換成ISO,然後通過磁碟工具掛載。