linux 中脚本运行方式

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.shsource script.sh 加载了一个脚本,这个脚本定义的变量、函数等都可以在当前会话中使用。例如:

. train_scripts/set_env.sh

此后,你可以直接使用脚本定义的内容,但同样仅限于当前会话。


2. 对其他 SSH 会话无影响

每次通过 SSH 登录服务器时,会启动一个全新的 shell 环境(通常基于服务器的默认配置文件,如 .bashrc.zshrc)。

  • 你在一个 SSH 会话中对环境的修改(通过 sourceexport)不会影响其他会话。
  • 如果希望修改对所有 SSH 会话都生效,需要将更改写入持久化配置文件(如 .bashrc.zshrc)。

3. 临时修改与持久化修改
临时修改
  • 使用 . script.shexport,仅对当前 SSH 会话有效。
  • 会话结束后更改自动丢失,适合临时测试或一次性任务。
持久化修改
  • 编辑 .bashrc.zshrc.profile 文件,添加需要的环境变量或脚本加载命令:
    echo 'export MY_VAR="hello"' >> ~/.bashrc source ~/.bashrc
  • 这样每次登录服务器时,环境都会自动加载这些修改。

注意

无论是 ./ 还是直接运行,脚本需要有可执行权限:

chmod +x train_models_util.sh

否则,即使路径正确,也可能报错:Permission denied

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值