在Linux系统中,脚本是将一系列命令按特定逻辑组织起来的文本文件,通过执行脚本可以自动化完成重复性任务,提高工作效率,运行脚本的流程涉及脚本创建、权限设置、执行方式选择等关键步骤,本文将详细说明整个过程。
脚本的创建与编辑
脚本的本质是文本文件,因此创建脚本需使用文本编辑器(如vim、nano、gedit等),以vim为例,创建一个名为test.sh
的脚本:
vim test.sh
进入编辑界面后,首先需指定脚本解释器,即Shebang行(位于脚本首行,以开头),例如#!/bin/bash
表示使用bash解释器执行脚本;若使用Python脚本,则需改为#!/usr/bin/python3
,Shebang的作用是告诉系统使用哪个程序来解析脚本内容。
接下来编写脚本内容,例如实现“输出当前日期和用户名”的简单脚本:
#!/bin/bash echo "当前日期: $(date)" echo "当前用户: $USER"
编写完成后,保存并退出(vim中按wq
),此时脚本文件已创建,但尚无执行权限。
设置脚本执行权限
Linux系统通过文件权限控制用户对文件的访问,普通用户默认无法直接执行脚本,需通过chmod
命令赋予执行权限,权限分为读(r)、写(w)、执行(x),分别对应数字4、2、1,可通过组合数字设置权限(如7=rwx,5=r-x等)。
常见权限设置方式
权限数字 | 用户权限 | 组权限 | 其他权限 | 含义 |
---|---|---|---|---|
755 | rwx | r-x | r-x | 用户可读写执行,组和其他可读执行 |
700 | rwx | 仅用户可读写执行 | ||
644 | rw- | rw- | r– | 用户和组可读写,其他仅读 |
为test.sh
添加执行权限的命令为:
chmod +x test.sh # 等同于chmod 755 test.sh,添加所有用户的执行权限 chmod 700 test.sh # 仅允许文件所有者执行
执行ls -l test.sh
可查看权限变化,若输出为-rwxr-xr-x
,则表示权限设置成功。
运行脚本的多种方式
通过绝对路径或相对路径执行
若脚本具有执行权限,可直接通过路径调用:
- 绝对路径:从根目录开始的完整路径,例如
/home/user/test.sh
,适用于任何目录。 - 相对路径:基于当前目录的路径,例如
./test.sh
(当前目录下的脚本)、../scripts/test.sh
(上级目录下的脚本)。
示例:
./test.sh # 假设当前目录在test.sh所在位置
使用source
或点号()执行
source
和点号()会在当前Shell环境中执行脚本,脚本中的变量、函数等会直接影响当前Shell,而不会创建子Shell。
source test.sh # 或 . test.sh
若脚本中定义了变量NAME="Linux"
,执行source test.sh
后,当前Shell可直接使用$NAME
变量。
通过解释器命令执行
若脚本无执行权限,或需指定解释器(如强制使用bash而非sh),可直接调用解释器执行:
bash test.sh # 使用bash解释器,无需执行权限 sh test.sh # 使用sh解释器(通常指向bash或dash) python3 script.py # 执行Python脚本
这种方式会创建子Shell执行脚本,脚本执行结束后,子Shell环境中的变量不会影响当前Shell。
通过nohup
后台执行
若需让脚本在后台持续运行(即使关闭终端),可使用nohup
命令:
nohup bash test.sh > output.log 2>&1 &
nohup
:忽略挂起信号(SIGHUP),关闭终端后脚本仍运行;> output.log
:将标准输出重定向到文件;2>&1
:将标准错误重定向到标准输出;&
:在后台运行。
脚本调试与常见问题
调试方法
- 语法检查:使用
bash -n script.sh
检查脚本语法,不执行仅报错。 - 逐行执行:使用
bash -x script.sh
,显示每条命令的执行过程和结果,便于定位逻辑错误。
常见错误及解决
- “Permission denied”:未设置执行权限,需运行
chmod +x script.sh
。 - “bad interpreter: No such file or directory”:Shebang路径错误(如
#!/bin/bash
写成#!/bin/bash/
),需检查解释器路径(可通过which bash
确认)。 - “command not found”:脚本中调用的命令未安装或不在
$PATH
中,需安装命令或使用绝对路径(如/usr/bin/ls
)。
相关问答FAQs
Q1:为什么用./test.sh
执行脚本时提示“Permission denied”,但ls -l
显示权限正常?
A:可能是因为脚本文件本身所属用户与当前执行用户不一致(如脚本属于root组,当前用户无组权限),或文件系统权限限制(如挂载了noexec
选项的文件系统),可尝试sudo ./test.sh
(若需root权限),或检查文件系统是否支持执行(mount | grep noexec
)。
Q2:source script.sh
和bash script.sh
执行脚本有什么区别?
A:核心区别在于执行环境。source
(或)在当前Shell中执行脚本,脚本中的变量、函数等会直接作用于当前Shell,执行后当前Shell环境会保留修改;而bash script.sh
会创建一个子Shell执行脚本,子Shell中的变量、函数等不会影响当前Shell,执行后子Shell关闭,当前Shell环境不变,若脚本中修改了PATH
变量,source
后当前Shell的PATH
会改变,bash
则不会。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/17665.html