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