關於#!/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,然後通過磁碟工具掛載。