Linux Shell编程 | 你真的了解Shell脚本执行方式吗?我看一半人还未必清楚

本文详细探讨了Shell脚本的四种执行方式:绝对路径、sh、.或source以及当前目录下的执行,并分析了sh与bash的区别。在执行脚本时,指定解释器、权限和路径的选择对脚本的执行有直接影响。此外,还讨论了脚本首行指定解释器的重要性以及执行方式对工作目录和进程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人生苦短,务必性感。

            目录

一、执行shell脚本方式多样化

二、sh和bash区别

三、如果脚本的首行指定的解释器不是#!/bin/bash呢

四、.sh不是shell脚本后缀吗?

五、切换路径的影响

六、Shell父进程子进程问题

说的再多,不如动手试试来的明白。

一、执行shell脚本方式多样化

Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。

比如/home/bin/下有个脚本 test.sh

#!/bin/bash
echo "hello world!"

第一种,以绝对路径方式去执行shell脚本

test.sh无执行权限时,执行/home/bin/test.sh,执行失败

我们给脚本赋权,chmod +x tets.sh,再次执行/home/bin/test.sh,执行成功

去掉首行解释器,再次执行,执行失败

其实,以绝对路径方式去执行shell脚本,也可以使用`pwd`命令

注意:pwd前后的 ` 不是英文的单引号,

而是英文输入法下的“~”同一个按键下面的那个符号,就在键盘esc下面那个键

总结:使用绝对路径方式必须为脚本首行指定解释器,也要给脚本添加执行权限

---------------------------------------------------------------------------------------------------------

第二种,最常用的执行方式,sh test.sh

test.sh无执行权限时,执行sh test.sh成功,说明sh方式不需要脚本拥有执行权限

去掉第一行#!/bin/bash ,再执行sh test.sh,仍能成功,

说明这是将test.sh作为参数传给sh(bash)命令来执行的,所有不必再第一行指定解释器

总结:sh方式不必为脚本首行指定解释器,不必给脚本添加执行权限

---------------------------------------------------------------------------------------------------------

第三种,以. 或 source 执行脚本

当test.sh未赋予执行权限时,执行失败

我们给test.sh赋执行权限,再次执行成功了

我们去掉首行解释器,再次执行,也是成功的

如果用. test.sh执行脚本,需要注意:点号.和文件名中间有一个空格

总结: . 或souece方式不必为脚本首行指定解释器,但必需给脚本添加执行权限

---------------------------------------------------------------------------------------------------------

第四种,以. / 执行脚本

这种必须进入脚本当前路径下,执行./test.sh,成功。这种执行方式必须给脚本赋下执行权限

使用./方式我们一般会在首行指定解释器,好让系统查找到正确的解释器

总结: ./方式必须为脚本首行指定解释器,也必需给脚本添加执行权限

---------------------------------------------------------------------------------------------------------

二、sh和bash区别

#!/bin/sh 和#!/bin/bash

#!是一个特殊标记,说明这是一个可执行的脚本,#!后面跟是脚本的解释器程序路径。

除了第一行,其他以#开头都表示注释。

那他们究竟有没有区别呢?

sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。

bash 就算出错,也会继续向下执行。

简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix

我们常用的Centos,/bin/sh都是指向/bin/bash的符号链接(其它Linux发行版本这里不做分析,没怎么使用过)

ln -s /bin/bash /bin/sh

看下图,其实 sh就是bash,我们man sh  manbash也可以看出没啥区别,个人惯用#!/bin/bash

总结:随便用

三、如果脚本的首行指定的解释器不是#!/bin/bash呢

上面我们有说到,sh是一个shell,运行sh test.sh,表示我使用sh来解释这个脚本。

如果我运行./test.sh,它一般会查找脚本第一行是否指定了解释器,如果没指定,那么就用当前系统默认的shell(大多数linux默认是bash),如果指定了解释器,那么就将该脚本交给指定的解释器。

我们修改下test.sh代码

#!/usr/bin/python
print("Hello World")

那么你运行./test.sh,结果是Hello,但是如果你运行sh a.run,会报语法错误,

因为这是一个python脚本,sh看不懂。

有人提出疑问,

四、.sh不是shell脚本后缀吗?

其实,Linux系统不是通过扩展名来识别文件类型的,在Linux中,带有扩展名的文件,只能代表程序的关联,并不能说明文件是可以执行,

给Shell脚本加.sh后缀只是一种规范和习惯,后缀我们也可以随意命名,甚至不写后缀。

我们把test.sh改为test执行以下看看,仍能成功

五、切换路径的影响

脚本在/home目录下 ,test.sh内容为:

#!/bin/sh
cd /home/peim
pwd
ls -l

如果在/home下执行./test.sh 或者sh test.sh,可以看到/home/peim/下的内容,但shell退出后还是在原来的工作目录/home。

如果/home下执行source test.sh,可以看到/home/peim/下的内容,且shell退出后在目录/home/peim下。

六、进程问题

source 命令和 sh 命令的执行机制是不同的:

  • source 在当前 Shell 环境下来执行脚本文件中的内容

  • sh        重新开辟一个新的子Shell,在子Shell 中执行脚本文件中的内容,执行完毕后再返回 父Shell

什么意思呢,举一个非常简单的例子:

我们在test.sh脚本最后一行添加exit 0,再用sh 和source执行看一下

#!/bin/sh
cd /home/peim
pwd
ls -l
exit 0

使用sh或./执行,可以看出像什么都没发生一样,感觉加上exit 0也没有任何影响

我们再使用source执行一下,可以看到居然退出到登录界面了

补充:

子shell里面的变量父shell无法使用,对环境变量的修改也不影响父shell。

父shell中的局部变量,子shell无法使用,只有父shell的环境变量,子shell能够使用。

sh 创建子shell和当前的shell并行执行,子shell中执行,脚本设置的变量不会影响当前shell。

一旦子Shell中的执行完毕,此子Shell随即结束,回到父Shell中,不会影响父Shell原本的环境。

子Shell环境拥有与父Shell相同的环境变量、标准输入、输出、错误。

未完

### ADB Shell 命令使用指南及常见操作 #### 一、进入设备 Shell 通过 `adb shell` 可以直接登录到 Android 设备的命令行界面,相当于远程控制设备终端。 执行以下命令即可进入设备的 Shell 环境: ```bash adb shell ``` 一旦成功进入,用户可以在设备环境中运行各种 Linux 和 Android 特定命令[^1]。 --- #### 二、Shell 下的基础命令 ##### 1. 列举目录内容 在设备中查看文件和目录列表可使用 `ls` 命令: ```bash ls /sdcard/ ``` 此命令会显示 `/sdcard/` 目录下的所有文件和子目录[^4]。 ##### 2. 显示详细信息 若需获取更详细的文件属性(如大小、修改时间等),可以加上 `-l` 参数: ```bash ls -l /data/local/tmp/ ``` ##### 3. 创建新目录 使用 `mkdir` 命令创建新的目录: ```bash mkdir /sdcard/new_folder ``` ##### 4. 删除文件或目录 删除单个文件可用 `rm` 命令;对于目录,则需要附加 `-r` 参数递归删除: ```bash rm /sdcard/file_to_delete.txt rm -r /sdcard/folder_to_delete ``` ##### 5. 修改权限 更改文件或目录的访问权限可通过 `chmod` 完成。例如赋予某文件读写权限: ```bash chmod 666 /sdcard/sample_file.txt ``` ##### 6. 查找进程 利用 `ps` 命令查找正在运行的应用程序和服务实例。结合管道符 (`|`) 和关键字匹配工具(如 `grep` 或 `findstr`)进一步筛选结果: ```bash ps | grep com.example.app ``` ##### 7. 终止进程 找到目标应用对应的 PID 后,运用 `kill` 结束其活动状态: ```bash kill <PID> ``` --- #### 三、高级功能与技巧 ##### 1. 执行单一命令而不切换上下文 如果仅想快速运行一条指令而无需完全沉浸于交互式的 Shell 模式里,那么可以直接追加具体动作给 `adb shell` 调用链路之后: ```bash adb shell ls -la / ``` 这种方式尤其适合脚本编程场景下自动化部署任务时调用[^2]。 ##### 2. 输入输出重定向 类似于标准 Unix/Linux 平台上的做法,在 Android 上也可以实现数据流方向调整。比如将日志记录保存下来以便后续分析: ```bash logcat -d > log_output.txt ``` 此处表示捕获当前缓冲区里的全部 LogCat 输出并存入主机侧新建出来的文本档当中[^4]. ##### 3. 编辑配置文件 虽然原生环境下缺乏图形化编辑器支持,不过依然能够依赖 vi/vim/nano 等轻量级纯文字型应用程序来在线修订各类设定文档。假设我们要修正 hosts 文件定义的话,就可以这么做: ```bash vi /etc/hosts ``` 注意:部分受限 ROM 可能禁用了这些实用的小工具,这时候就得考虑先解锁 Root 权限再行动了。 --- #### 四、注意事项 - **权限问题**:很多核心区域默认处于只读锁定状态,即便拥有超级管理员身份也未必允许随意篡改系统组件。必要时刻得借助 busybox 工具集扩展能力或是重新编译定制版固件才行。 - **安全性考量**:开放过多自由度的同时也会带来潜在风险隐患,请务必谨慎对待每一项改动决定[^3]! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我自人间漫浪

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值