1、 ./script.sh
./
表示当前目录。当脚本文件位于当前目录时,使用 ./first_directory/script.sh
可以明确地告诉 shell 运行 script
.sh 这个文件。
2. 不带 ./
的调用
当你直接运行 first_directory/script.sh
时,有以下几种可能性:
a) 文件路径明确
如果 first_directory/script.sh
是一个相对路径,且你当前的工作目录刚好包含 first_directory/
,shell 会找到并运行它,无需显式添加 ./
。
b) 脚本在环境变量 PATH
中
如果 first_directory/script.sh
位于 PATH
环境变量中定义的路径中,系统会直接找到并运行它。例如,PATH
包含了 /usr/local/bin/
,而你将脚本放在那里,那么直接输入脚本名或相对路径都能运行。
export PATH=$PATH:/path/to/first_directory
script.sh
c) 别名或软链接
脚本可能通过别名或软链接配置到一个全局可访问的路径。例如:
ln -s /absolute/path/to/first_directory/script.sh /usr/local/bin/script.sh
3、 source 或者 .
有时候打快了可能漏掉/ 而直接执行 . script
.sh
在 Linux 中,点号 (.
) 是 source
命令的缩写。
这条命令的作用是 在当前 shell 会话中加载并执行脚本。
区别于直接执行脚本(如 ./script.sh
),. script.sh
会将脚本中的变量和函数加载到当前 shell 环境中,而不会启动一个新的子 shell。
直接运行脚本 vs 使用 .
或 source
的区别
1. 直接运行脚本
这种方式会启动一个新的子 shell 来执行脚本。
- 脚本中的变量或环境更改仅在子 shell 中有效。
- 当前 shell 不会受到脚本执行的影响。
2. 使用 .
或 source
这种方式会在当前 shell 会话中执行脚本,没有子 shell 的隔离。
- 脚本中的变量、函数等会被加载到当前 shell 环境中。
- 当前 shell 的环境会被脚本修改(如变量赋值、路径更改等)
示例
假设有一个脚本 set_env.sh
:
#!/bin/bash
export MY_VAR="Hello, World"
直接运行
./set_env.sh
echo $MY_VAR
输出为空,因为变量 MY_VAR
在子 shell 中生效,当前 shell 并未加载该变量。
使用 .
或 source
. set_env.sh
echo $MY_VAR
输出为Hello, World。这是因为 .
加载了脚本内容,修改了当前 shell 的环境。
当你使用 . script.sh
时:
- 这实际上是调用了
source
命令。 - 脚本的内容会直接在当前 shell 中运行,而不是创建新的子 shell。
- 适用于希望脚本修改当前 shell 环境(如设置变量或函数)的场景。
SSH会话
在使用 SSH 连接实验室的服务器时,修改当前 shell 环境会影响你的当前 SSH 会话,但这些修改的范围和作用有以下几点需要注意:
1. 当前 SSH 会话内的影响
修改 shell 环境(比如设置环境变量、加载新的路径、定义函数等)只对当前 SSH 会话有效,影响范围如下:
a) 环境变量的影响
如果你在当前 shell 环境中通过 export
命令设置了环境变量(如 export PATH=/new/path:$PATH
),这些变量会影响当前会话中运行的命令。例如:
export MY_VAR="hello"
echo $MY_VAR # 输出 hello
但当你关闭当前 SSH 会话后,这些修改会被丢弃。下一次登录时,环境会恢复为默认配置。
b) 修改 PATH 的影响
通过 export PATH=...
修改 PATH
,会影响当前会话中运行命令的方式。例如,你临时将自定义路径加入 PATH
:
export PATH=$HOME/my_programs:$PATH
在当前 SSH 会话中,你可以直接运行自定义路径下的程序。但这些更改在会话结束后会失效。
c) 加载脚本的影响
如果你通过 . script.sh
或 source script.sh
加载了一个脚本,这个脚本定义的变量、函数等都可以在当前会话中使用。例如:
. train_scripts/set_env.sh
此后,你可以直接使用脚本定义的内容,但同样仅限于当前会话。
2. 对其他 SSH 会话无影响
每次通过 SSH 登录服务器时,会启动一个全新的 shell 环境(通常基于服务器的默认配置文件,如 .bashrc
或 .zshrc
)。
- 你在一个 SSH 会话中对环境的修改(通过
source
或export
)不会影响其他会话。 - 如果希望修改对所有 SSH 会话都生效,需要将更改写入持久化配置文件(如
.bashrc
或.zshrc
)。
3. 临时修改与持久化修改
临时修改
- 使用
. script.sh
或export
,仅对当前 SSH 会话有效。 - 会话结束后更改自动丢失,适合临时测试或一次性任务。
持久化修改
- 编辑
.bashrc
、.zshrc
或.profile
文件,添加需要的环境变量或脚本加载命令:echo 'export MY_VAR="hello"' >> ~/.bashrc source ~/.bashrc
- 这样每次登录服务器时,环境都会自动加载这些修改。
注意
无论是 ./
还是直接运行,脚本需要有可执行权限:
chmod +x train_models_util.sh
否则,即使路径正确,也可能报错:Permission denied
。