我正在创建一个小型自动设置脚本,如果某些路径未导出/etc/profile
,它将进行修改$HOME/.profile
。然后,我想自动重新加载这些路径。
我读过这样的source
方法,所以我启动了终端并输入:
source /etc/profile
source ~/.profile
从终端来看,它没有输出任何错误。
但是,将这两个命令放入 Bash 脚本中会导致source: not found
。
- 我如何确定脚本由 Bash 执行,即使
#!/bin/sh
指定了(显然,它不能保证这一点)? - 为什么会说这两个来源无法被找到,尽管它们显然是存在的呢?
答案1
/bin/sh
不是bash
。要使用 执行脚本bash
,请#!/bin/bash
在脚本的第一行中写入。
错误source: not found
没有被删除,因为/etc/profile
没有找到。它被删除了,因为source
没有找到。source
是一个 Bash 内置函数,并且您没有使用 执行脚本bash
。所以很明显为什么没有找到它。更改#!
脚本中的行,它就会起作用。
答案2
有些 shell 支持.
而不是source
。因此你可以尝试类似这样的操作
. filename
代替
source filename
希望它有效
答案3
1. 我如何确定脚本由 Bash 执行,即使
#!/bin/sh
指定了(显然,它不能保证这一点)?
为了确保为sh
shell 编写的脚本(如您的情况 - 请参阅#!/bin/sh 和 #!/bin/bash 有什么区别?)通过Bash执行,只需运行以下命令:
bash script_name
因此,您将不会再收到该错误。
2. 这两个源头显然是存在的,为什么却说找不到呢?
它并没有说那些源文件不存在。它说source
找不到命令。这是正常的,因为既然你用#!/bin/sh
line 开始你的脚本,你的脚本将使用 运行sh
,而不是bash
你想象的那样。为什么这是正常的?因为source
命令是 Bash 内置的,但不是sh
内置的。要以 为源文件sh
,你应该使用.
(点)。示例:
. /etc/profile
. ~/.profile
答案4
看到这个那么问题来了:
/bin/sh
通常是其他试图模仿 Shell 的 shell。许多发行版使用/bin/bash
,sh
它支持源。但在 Ubuntu 上,/bin/dash
使用的是 ,它不支持源。如果您无法编辑脚本,请尝试更改运行它的 shell。