當前位置: 首頁>>技術教程>>正文


運行腳本時出現錯誤消息“源:未找到”

, ,

問題描述

我正在創建一個小的自動設置腳本,如果某些路徑未導出,它將修改 /etc/profile$HOME/.profile。然後,我想自動重新加載這些。

我讀過 source 是這樣做的,所以我啟動了終端並輸入:

source /etc/profile
source ~/.profile

從終端,它沒有輸出任何錯誤。

但是,將這兩個命令放在 Bash 腳本中會導致 source: not found

  1. 即使指定了 #!/bin/sh (顯然,它不能保證),我如何確定腳本是由 Bash 執行的?

  2. 為什麽當這兩個來源明確無誤的時候,卻說找不到呢?

最佳辦法

/bin/sh 不是 bash 。要使用 bash 執行腳本,請將 #!/bin/bash 作為腳本的第一行。

未刪除錯誤 source: not found,因為未找到 /etc/profile。它已被刪除,因為未找到 sourcesource 是 Bash 內置 函數,您不要使用 bash 執行腳本。所以很清楚為什麽找不到它。更改腳本中的 #! 行,它將起作用。

次佳辦法

一些 shell 支持 . 而不是 source 。所以你可以嘗試這樣的事情

. filename

代替

source filename

希望它有效

第三種辦法

1. How can I be sure that the script is executed by Bash, even if #!/bin/sh is specified (apparently, it does not guarantee it)?

為確保為 sh shell 編寫的腳本(如您的情況 – 請參閱 What is difference between #!/bin/sh and #!/bin/bash? )由 Bash 執行,隻需運行以下命令:

bash script_name

因此,您將不會再收到該錯誤。

2. Why would it say that these two sources cannot be found when they are unmistakably there?

它並不是說那些源文件不存在。它說找不到 source 命令。這是正常的,因為由於您使用 #!/bin/sh 行啟動腳本,因此您的腳本將使用 sh 而不是您可能認為的 bash 運行。為什麽是正常的?因為 source 命令是 Bash 內置命令,而不是 sh 內置命令。要在 sh 中獲取文件,您應該使用 .(點)。例子:

. /etc/profile
. ~/.profile

另一種方法是將 shebang 線更改為 #!/bin/bash,如 chaoshis answer 中所說。

第四種辦法

看到這個 SO question

/bin/sh is usually some other shell trying to mimic The Shell. Many distributions use /bin/bash for sh, it supports source. On Ubuntu, though, /bin/dash is used which does not support source. If you cannot edit the script, try to change the shell which runs it.

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/12425.html,未經允許,請勿轉載。