|
@@ -0,0 +1,96 @@
|
|
|
+# 什么是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 脚本执行过程中出现错误就立即退出并返回非零状态码,从而更好地确保脚本执行的可靠性。
|