Linux 脚本执行

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验聚焦于理解和使用 Linux 中的 source 命令,它是在当前 shell 中执行脚本的强大工具。与在单独子进程中运行的常规脚本执行不同,source 命令在当前 shell 环境中执行文件中的命令。这使得脚本中定义的变量和函数能在当前会话中持续存在。

在整个实验过程中,你将学习:

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

在本实验结束时,你将能够自如地使用 source 命令进行高效的 Linux shell 脚本编写和环境管理。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/source("Script Executing") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills linux/echo -.-> lab-271387{{"Linux 脚本执行"}} linux/source -.-> lab-271387{{"Linux 脚本执行"}} linux/ls -.-> lab-271387{{"Linux 脚本执行"}} linux/chmod -.-> lab-271387{{"Linux 脚本执行"}} linux/cd -.-> lab-271387{{"Linux 脚本执行"}} linux/nano -.-> lab-271387{{"Linux 脚本执行"}} end

创建并引用基本脚本

在这一步中,我们将创建一个简单的脚本文件,并使用 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+OEnter,然后按 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+OEnter,然后按 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 环境中执行脚本。以下是你所完成内容的回顾:

  1. 创建并引用基本脚本:你了解了使用 source 与常规脚本执行的区别,因为它允许脚本中定义的变量和函数在当前 shell 会话中持续存在。
  2. 向引用的脚本传递参数:你探索了如何在使用 source 命令时通过向脚本传递参数来使脚本更灵活,以及如何在脚本内部处理这些参数。
  3. 设置开发环境:你创建了一个实用的脚本,该脚本可以设置包含多个环境变量和配置的开发环境,这是 source 命令在现实世界中的常见用例。

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

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

这些技能对于任何使用 Linux 系统的人来说都是基础技能,尤其对于开发人员、系统管理员和 DevOps 工程师而言。通过掌握 source 命令,你可以创建更高效、更有条理的脚本来管理你的 Linux 环境。