Linux 脚本执行

ShellBeginner
立即练习

介绍

本实验重点介绍如何理解并使用 Linux 中的 source 命令。这是一个强大的工具,用于在当前 Shell 中执行脚本。与在独立子进程中运行的常规脚本执行方式不同,source 命令会在当前 Shell 环境中执行文件中的命令。这使得脚本中定义的变量和函数能够保留在当前的会话中。

通过本实验,你将学习:

  • 如何使用 source 命令创建和执行脚本
  • 在使用 source 时如何向脚本传递参数
  • source 命令与常规脚本执行方式的区别
  • 如何使用 source 命令设置环境变量

完成本实验后,你将能够熟练使用 source 命令,从而更高效地进行 Linux Shell 脚本编写和环境管理。

创建并使用 source 执行基础脚本

在此步骤中,我们将创建一个简单的脚本文件,并使用 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 命令来运行该脚本:

source variables.sh

你将看到相同的输出:

The weather is now set to: Sunny

再次检查 WEATHER 变量:

echo $WEATHER

这一次,你应该会看到:

Sunny

WEATHER 变量现在存在于你当前的 Shell 中,因为你使用了 source 命令来执行脚本。

6. 使用简写形式

你也可以使用点号(.)作为 source 命令的简写形式:

. ./variables.sh

这将产生与使用 source variables.sh 相同的结果。./ 前缀告诉 Shell 从当前目录加载并执行脚本。

在 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+OEnter,然后按下 Ctrl+X 保存并退出 nano。

2. 使脚本可执行

chmod +x greeting.sh

3. 使用参数执行 source 脚本

让我们使用 source 执行脚本并传递一个名称参数:

source greeting.sh "Alice"

你应该会看到输出:

Hello, Alice!

现在检查 GREETING 变量是否在你当前的 Shell 中设置:

echo $GREETING

你应该会看到:

Hello, Alice!

4. 使用不同的参数执行 source

尝试再次使用不同的名称执行该脚本:

source greeting.sh "Bob"

输出:

Hello, Bob!

再次检查 GREETING 变量:

echo $GREETING

输出:

Hello, Bob!

注意 GREETING 变量是如何更新为新值的。

5. 不带参数执行 source

你也可以在不带任何参数的情况下执行该脚本:

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+OEnter,然后按下 Ctrl+X 保存并退出 nano。

2. 使脚本可执行

chmod +x dev_env.sh

3. 使用 source 执行开发环境脚本

现在,让我们使用 source 执行该脚本来设置我们的开发环境:

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 环境中执行脚本。以下是你所学内容的总结:

  1. 创建并使用 source 执行基础脚本:你了解了 source 与常规脚本执行方式的区别,因为它允许脚本中定义的变量和函数保留在你当前的 Shell 会话中。

  2. 向 source 脚本传递参数:你探索了如何通过在使用 source 命令时传递参数来使脚本更具灵活性,以及如何在脚本内部处理这些参数。

  3. 设置开发环境:你创建了一个实用的脚本,用于设置包含多个环境变量和配置的开发环境,这是 source 命令在现实世界中的常见用例。

source 命令是 Linux 脚本编写中的一个强大工具,它允许你:

  • 设置在整个 Shell 会话中持续有效的环境变量
  • 定义可在会话后续过程中使用的函数
  • 创建可重用的模块化配置
  • 快速且一致地设置复杂的环境

这些技能对于从事 Linux 系统工作的人员(特别是开发人员、系统管理员和 DevOps 工程师)来说是基础性的。通过掌握 source 命令,你可以创建更高效、更有条理的脚本来管理你的 Linux 环境。