问题描述
我正在创建一个小的自动设置脚本,如果某些路径未导出,它将修改 /etc/profile
和 $HOME/.profile
。然后,我想自动重新加载这些。
我读过 source
是这样做的,所以我启动了终端并输入:
source /etc/profile
source ~/.profile
从终端,它没有输出任何错误。
但是,将这两个命令放在 Bash 脚本中会导致 source: not found
。
-
即使指定了
#!/bin/sh
(显然,它不能保证),我如何确定脚本是由 Bash 执行的? -
为什么当这两个来源明确无误的时候,却说找不到呢?
最佳办法
/bin/sh
不是 bash
。要使用 bash
执行脚本,请将 #!/bin/bash
作为脚本的第一行。
未删除错误 source: not found
,因为未找到 /etc/profile
。它已被删除,因为未找到 source
。 source
是 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
,如 chaos 在 his answer 中所说。
第四种办法
看到这个 SO question :
/bin/sh
is usually some other shell trying to mimic The Shell. Many distributions use/bin/bash
forsh
, 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.