介绍
本实验聚焦于理解和使用 Linux 中的 source 命令,它是在当前 shell 中执行脚本的强大工具。与在单独子进程中运行的常规脚本执行不同,source 命令在当前 shell 环境中执行文件中的命令。这使得脚本中定义的变量和函数能在当前会话中持续存在。
在整个实验过程中,你将学习:
- 如何使用
source命令创建和执行脚本 - 使用
source时如何向脚本传递参数 source命令与常规脚本执行的区别- 如何使用
source命令设置环境变量
在本实验结束时,你将能够自如地使用 source 命令进行高效的 Linux shell 脚本编写和环境管理。
创建并引用基本脚本
在这一步中,我们将创建一个简单的脚本文件,并使用 source 命令在当前 shell 环境中执行它。这将帮助我们理解 source 与常规脚本执行的区别。
当你正常运行脚本(使用 ./script.sh)时,shell 会创建一个新的子进程来执行该脚本。脚本中定义的任何变量或函数仅存在于该子进程中,并在脚本执行完毕后消失。然而,当你使用 source 命令(或其简写 .)时,脚本中的命令会在当前 shell 环境中执行,从而使变量和函数在脚本执行完成后仍然存在。
让我们创建一个基本脚本来演示这个概念:
1. 导航到项目目录
首先,确保你位于正确的目录中:
cd ~/project
2. 创建一个简单的脚本文件
使用 nano 编辑器创建一个名为 variables.sh 的新文件:
nano variables.sh
将以下内容添加到文件中:
#!/bin/bash
## This script sets an environment variable
export WEATHER="Sunny"
echo "The weather is now set to: $WEATHER"
按 Ctrl+O 保存文件,然后按 Enter 确认文件名,最后按 Ctrl+X 退出 nano。
3. 使脚本可执行
在运行脚本之前,我们需要使其可执行:
chmod +x variables.sh
4. 正常运行脚本
首先,让我们以传统方式运行脚本:
./variables.sh
你应该会看到类似以下的输出:
The weather is now set to: Sunny
现在,检查 WEATHER 变量是否存在于当前 shell 中:
echo $WEATHER
你可能看不到任何输出,或者只看到一个空行。这是因为该变量仅在运行脚本的子进程中设置,而不是在当前 shell 中。
5. 引用脚本
现在,让我们使用 source 命令来运行脚本:
source variables.sh
你会看到相同的输出:
The weather is now set to: Sunny
再次检查 WEATHER 变量:
echo $WEATHER
这次,你应该会看到:
Sunny
WEATHER 变量现在存在于当前 shell 中,因为你使用了 source 命令来执行脚本。
6. 使用简写符号
你也可以使用点号 (.) 作为 source 命令的简写符号:
. variables.sh
这将产生与使用 source variables.sh 相同的结果。
带参数使用 source 命令
在这一步中,你将学习在使用 source 命令时如何向脚本传递参数。当你需要让脚本更灵活、更具可复用性时,这非常有用。
和常规的脚本执行一样,使用 source 命令时也可以向脚本传递参数。在脚本内部,这些参数可以通过标准的位置参数($1、$2 等)访问,就像直接运行脚本时一样。
1. 创建一个接受参数的脚本
在 ~/project 目录下创建一个名为 greeting.sh 的新文件:
cd ~/project
nano greeting.sh
将以下内容添加到文件中:
#!/bin/bash
## This script accepts a name parameter and sets a greeting variable
## Check if a parameter was provided
if [ -z "$1" ]; then
NAME="Guest"
else
NAME="$1"
fi
## Set the greeting environment variable
export GREETING="Hello, $NAME!"
echo "$GREETING"
按 Ctrl+O、Enter,然后按 Ctrl+X 保存并退出 nano。
2. 使脚本可执行
chmod +x greeting.sh
3. 带参数引用脚本
让我们引用脚本并传递一个姓名参数:
source greeting.sh "Alice"
你应该会看到如下输出:
Hello, Alice!
现在检查 GREETING 变量是否已在当前 shell 中设置:
echo $GREETING
你应该会看到:
Hello, Alice!
4. 使用不同的参数引用脚本
尝试再次引用脚本,并使用不同的姓名:
source greeting.sh "Bob"
输出:
Hello, Bob!
再次检查 GREETING 变量:
echo $GREETING
输出:
Hello, Bob!
注意 GREETING 变量是如何被新值更新的。
5. 不使用参数引用脚本
你也可以不使用任何参数来引用脚本:
source greeting.sh
输出:
Hello, Guest!
当没有提供参数时,脚本会使用默认值("Guest")。
再检查一次 GREETING 变量:
echo $GREETING
输出:
Hello, Guest!
这展示了你如何通过处理不同的输入参数让脚本更具适应性。
创建开发环境脚本
在这一步中,我们将创建一个更实用的示例:一个用于设置包含多个变量的开发环境的脚本。这是 source 命令在实际场景中的常见用例。
1. 创建开发环境脚本
在 ~/project 目录下创建一个名为 dev_env.sh 的新文件:
cd ~/project
nano dev_env.sh
将以下内容添加到文件中:
#!/bin/bash
## Development environment setup script
## Database connection settings
export DB_HOST="localhost"
export DB_PORT="5432"
export DB_USER="dev_user"
export DB_PASSWORD="dev_password"
export DB_NAME="dev_database"
## API settings
export API_URL="http://localhost:3000/api"
export API_KEY="dev_api_key_123"
## Application paths
export APP_ROOT="/home/labex/project/app"
export LOG_DIR="/home/labex/project/logs"
## Create directories if they don't exist
mkdir -p $APP_ROOT
mkdir -p $LOG_DIR
## Display confirmation message
echo "Development environment configured with the following settings:"
echo "-----------------------------------------------------------"
echo "Database: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"
echo "API URL: $API_URL"
echo "App Root: $APP_ROOT"
echo "Log Directory: $LOG_DIR"
echo "-----------------------------------------------------------"
echo "Environment is ready for development!"
按 Ctrl+O、Enter,然后按 Ctrl+X 保存并退出 nano。
2. 使脚本可执行
chmod +x dev_env.sh
3. 引用开发环境脚本
现在,让我们引用该脚本以设置开发环境:
source dev_env.sh
你应该会看到类似以下的输出:
Development environment configured with the following settings:
-----------------------------------------------------------
Database: dev_user@localhost:5432/dev_database
API URL: http://localhost:3000/api
App Root: /home/labex/project/app
Log Directory: /home/labex/project/logs
-----------------------------------------------------------
Environment is ready for development!
4. 验证环境变量是否已设置
让我们检查脚本设置的一些环境变量:
echo "Database connection string: $DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME"
输出:
Database connection string: dev_user:dev_password@localhost:5432/dev_database
检查 API 设置:
echo "API settings: $API_URL with key $API_KEY"
输出:
API settings: http://localhost:3000/api with key dev_api_key_123
5. 验证目录是否已创建
检查脚本中指定的目录是否已创建:
ls -la ~/project/app ~/project/logs
你应该会看到显示这两个目录都存在的输出。
这个示例展示了你如何使用 source 命令来设置一个包含多个环境变量和配置的完整开发环境。这种方法在开发工作流中常用于在不同环境(开发、测试、生产等)之间进行切换。
总结
在本次实验中,你学习了如何在 Linux 中使用 source 命令在当前 shell 环境中执行脚本。以下是你所完成内容的回顾:
- 创建并引用基本脚本:你了解了使用
source与常规脚本执行的区别,因为它允许脚本中定义的变量和函数在当前 shell 会话中持续存在。 - 向引用的脚本传递参数:你探索了如何在使用
source命令时通过向脚本传递参数来使脚本更灵活,以及如何在脚本内部处理这些参数。 - 设置开发环境:你创建了一个实用的脚本,该脚本可以设置包含多个环境变量和配置的开发环境,这是
source命令在现实世界中的常见用例。
source 命令是 Linux 脚本编写中的强大工具,它允许你:
- 设置在整个 shell 会话中持续存在的环境变量
- 定义可在会话后期使用的函数
- 创建可重复使用的模块化配置
- 快速且一致地设置复杂环境
这些技能对于任何使用 Linux 系统的人来说都是基础技能,尤其对于开发人员、系统管理员和 DevOps 工程师而言。通过掌握 source 命令,你可以创建更高效、更有条理的脚本来管理你的 Linux 环境。



