1. 程式人生 > >Linux下,同一個指令碼使用bash 和sh 啟動,表現不同,sh 啟動失敗

Linux下,同一個指令碼使用bash 和sh 啟動,表現不同,sh 啟動失敗

Linux下,同一個指令碼使用bash 和sh 啟動,表現不同,sh 啟動失敗

指令碼內容

source setup.bash
source /opt/ros/kinetic/setup.bash
roslaunch hello hello.launch

儲存為start.sh

現象

  1. sh start.sh 失敗
  2. bash start.sh成功

原因

  1. sh 是bash 的一個軟連線, 但sh 不是完全等同於bash ,其相當於 bash -posix
  2. 關於bash 的 posix模式在man bash中有相關的描述:When bash is not in posix mode, the current directory is searched if no file is found in PATH.
    即:如果bash不是執行在posix模式下,當檔名作為source的引數,系統會先從PATH中查詢,如果在PATH中,也就是系統變數中找不到這個檔案時會在當前目錄下查詢這個檔案。所以在不使用posix模式的情況下 start.sh指令碼中的source setup.sh不會出錯,因為即使在PATH中找不到,也會在當前目錄中進行查詢。
  3. .也就是source這種內建命令在使用檔名作為引數時,如果在PATH中無法找到,將不會在當前目錄自動進行查詢

所以使用sh時,source 命令便會提示找不到檔案

參考連結

  1. https://zhidao.baidu.com/question/2076298033195900748.html
  2. http://structure.usc.edu/bash/bashref_6.html#SEC83