# 什么是source命令? 运行shell时,会同时存在两种变量: - **1) 局部变量** 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 - **2) 环境变量** 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 在 Linux 中,source 命令用于执行指定的 shell 脚本文件,并将脚本文件中的所有命令都当作当前 shell 环境的命令来运行。简单地说,source 命令可以让你在当前的 shell 环境中执行一个脚本文件,并将其中定义的环境变量和函数等内容加载到当前的 shell 环境中。 具体而言,source 命令可以实现如下功能: 1. 在当前 shell 环境中载入指定脚本文件的内容,包括环境变量、函数等。 2. 不创建新的子 shell 进程,而是在当前 shell 环境中执行脚本文件中的命令,从而实现在当前 shell 中设置环境变量或执行函数等操作。 使用 source 命令的常见场景包括: 1. 执行 shell 脚本文件,以实现设置环境变量、执行别名或函数等功能。 2. 加载特定的 shell 配置文件,例如 ~/.bashrc 或 /etc/profile,以初始化 shell 环境。 总之,source 命令可以帮助你在当前的 shell 环境中执行指定的脚本文件,并将其中定义的环境变量、函数等内容加载到当前的 shell 操作中,非常有用。 ## 简单例子 ```sh export var=999 ``` 如果`./my.sh`,运行后,执行`echo $var`是空的。 如果`source ./my.sh`运行后,执行`echo $var`会显示999。 因为调用`./my.sh`来执行`shell`是在一个子`shell`里运行的,所以执行后,里面定义的变量并没有反应到本`shell`里,但是 `source`不同,是在本`shell`中执行的,所以本shell能够看到其定义的变量。 # export命令 在 Linux 中,export 命令用于向当前 shell 环境中添加新的环境变量,使其能被当前 shell 环境及其子进程所访问和使用。简单地说,export 命令可以将一个变量设置为环境变量,从而可以在当前 shell 会话中以及当前 shell 的子进程中使用该变量。 具体而言,export 命令可以实现如下功能: 1. 将指定的变量设置为当前 shell 环境的环境变量。 2. 将环境变量持久化保存到系统文件中,以便在下次启动时仍然可用。 3. 环境变量的作用范围不仅限于当前 shell 环境,还包括当前 shell 环境的所有子进程,因此可以实现父子进程之间的环境变量共享。 使用 export 命令可以将一个普通变量设置为环境变量,例如: ```shell MY_VAR="hello" export MY_VAR ``` 这样就将 MY_VAR 变量设置为当前 shell 环境的环境变量,以便在当前 shell 会话和当前 shell 的子进程中使用。 同时,你也可以直接在一行中同时定义和导出一个环境变量,例如: ```shell export MY_VAR="hello" ``` 这样也可以将 MY_VAR 设置为环境变量,并将其导出到当前 shell 环境中。 总之,export 命令可以将指定变量设置为环境变量,并将其在当前 shell 环境及其子进程中进行共享和使用,非常有用。 # #!/bin/bash 作用 `#!/bin/bash` 是一种脚本文件的头部声明,也称为 Shebang 或 Hashbang。在 Linux 和 Unix 系统中,这行命令用于指定解释器的路径,让操作系统知道该如何执行该脚本文件。 具体而言,当一个脚本文件被执行时,操作系统会读取脚本文件的第一行,如果该行指定了解释器的路径,操作系统就会使用该解释器来执行该脚本文件;否则,操作系统会使用默认的解释器来执行该脚本文件(在大多数情况下是 /bin/sh)。 因此,在编写 Shell 脚本时,将 `#!/bin/bash` 添加到脚本文件的开头可以确保脚本文件将使用 Bash 解释器来执行,而不是其他解释器。同时,还可以通过修改 Shebang 行的内容来指定使用其他解释器来执行脚本文件。 需要注意的是,`#!/bin/bash` 命令在脚本文件的开头必须是第一行,并且不能有任何空格或其他字符紧随其后,否则该命令将不会被正确识别,从而导致脚本无法执行。 总之,`#!/bin/bash` 命令的作用是指定解释器的路径,让操作系统知道该如何执行该脚本文件。在编写 Shell 脚本时,通常需要添加该命令到脚本文件的开头。 # -e作用 `-e` 是 Bash 脚本中的一个选项,用于指定在脚本执行过程中如果出现错误就立即退出并返回非零(非正常)状态码。 具体而言,当在 Bash 脚本中添加了 `set -e` 命令后,表示开启了该选项(也可以使用 `set -o errexit`),此时如果在脚本的任何一行命令或管道执行失败,Bash 就会立即退出并返回非零状态码。这个特性可以确保脚本在执行过程中出现错误后可以立即停止执行,避免产生更多的错误。 举个例子,假设有一个名为 `test.sh` 的 Shell 脚本文件,它的内容如下: ```shell #!/bin/bash set -e echo "start" command_not_exist echo "end" ``` 其中,`set -e` 指定了开启 `-e` 选项,`command_not_exist` 是一条不存在的命令。 如果在执行该脚本时,命令 `command_not_exist` 执行失败,那么该脚本就会立即退出,并且不会输出 "end"。同时,脚本会返回一个非零状态码(通常是 1),表示脚本执行过程中发生错误。 总之,`-e` 选项可以确保在 Bash 脚本执行过程中出现错误就立即退出并返回非零状态码,从而更好地确保脚本执行的可靠性。