shell 与 命令的执行

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享流AI工具!学习进阶更高效! 阅读详情

在 shell 里执行的命令 3 种:

1.内置命令(Builtin)

shell 执行这些命令时不会派生新进程,而是由 shell 直接执行。比如 read, set, export 都是内置命令,这些命令需要用 help command 来查看其帮助信息。

2. 外部命令

外部命令就是普通的可执行二进制文件,shell 在执行它们时会 fork 出新进程(这是一个子 shell),然后用 exec 系列函数来执行它们,这时候子 shell 的环境就被命令的环境所取代。

3. shell 脚本

在执行 shell 脚本时,shell 同样会先执行 fork 派生出子进程,然后使用 exec 来调用脚本解释程序(内核中会检查脚本中的第一行 #!/bin/xxx 来确定是调用哪一种),然后将脚本装入,由它来解释执行。脚本解释器有很多,比如 bash, cshell, perl, python 等。如果被调出来的解释程序和当前 shell 是同一种 shell,那么它就是当前 shell 的子 shell,脚本中的命令都在子 shell 中执行,不会影响父 shell 的环境。

( ) 和 { } 中的指令组:

在 ( ) 和 { } 中都可以内置一组指令。( ) 中的指令会在一个子 shell 中执行,命令执行结果不影响当前 shell。需要注意的是,$$ 代表当前 shell 进程的 PID,而不是子 shell 进程的 PID 。

{ } 中的指令在当前 shell 中执行,指令执行结果会影响当前的环境。

后台执行和异步执行

在一个 shell 脚本中将一个命令通过 & 放入后台执行,这个命令和当前 shell 的执行是并行的,当前 shell 会派生一个子 shell 执行这个后台命令,而自己则继续往下执行,两者并没有相互依赖及等待的关系,所以这是一种异步的执行方式。以下代码可以说明这一点:

#!/bin/bash

LOG=$0.log

COMMAND1="sleep 100"

echo "Logging PIDs background commands for script: $0" >> "$LOG"

echo >> "$LOG"

echo -n "PID of \"$COMMAND1\": " >> "$LOG"

${COMMAND1} &

echo $! >> "$LOG"

上面的脚本中,sleep 100 这条指令会被放入后台执行,而当前 shell 会继续执行下面的 echo 语句,它并不会等待 sleep 执行完毕后才去执行下面的 echo ,这一点可以通过查看 $0.log 文件得以验证。

命令替换

command 会将 command 命令的输出结果代换到当前的命令行。command 在子 shell 中执行,它的结果不会影响到当前 shell 。比较下面代码:

#!/bin/bash

pwd

dir=`cd /tmp; pwd`

echo $dir

pwd

输出:

$ ./substitute.sh
/home/beyes/shell
/tmp
/home/beyes/shell

当前 shell 所在的目录在并没有改变。

管道

对于 bash 来说(dash,ash 等大部分 shell 也一样),管道中的命令都是放在子 shell 里执行的,所以像以下命令不会得到你希望的结果:

command | read var

管道中,左侧命令的标准输出会作为右侧命令的标准输入。但是上面命令中的 command 的执行结果会被 var 捕获么?看下面例子:

#!/bin/bash

a="hello world"

echo "$a"| read var

echo $var

exit 0

运行输出为空。本来希望 "hello world" 字串被 var 捕获,但是实际上不会。这是因为,管道中的命令是放在子 shell 里执行的,所以 var 得到的值无法传递到当前 shell ,所以这里要输出为空。

那么我们改变一下上面的代码以证明这一点:

#!/bin/bash

a="hello world"

echo "$a"| (read var; echo "In subshell:$var")

echo "In parent shell: $var"


exit 0

运行输出:

beyes@debian:~/shell$ ./var.sh
In subshell:hello world
In parent shell:

好,这时可以正确输出了。如上面所讲,括号中的命令组都属于同一个子 shell,所以括号里面的那个 $var 是属于子 shell,它在括号里输入,当然能看到正常的字串。而在括号之外的 $var,是属于父 shell 的,所以无法得到字串,子 shell 里的变量其实就和 C 语言中的局部变量一样。

但是如 korn shell 可以实现 command |read var 的,这缘于 shell 的设计不同,因为在 korn shell 里管道中的命令是在当前 shell 里执行的。为了保持脚本的兼容性,应该避免这种做法。


转载自:

shell 与 命令的执行


Android应用执行Shell命令:原理、实践安全指南 Shell作为操作系统用户交互的命令行界面,是Linux/Unix系统的核心组件,通过解析用户输入来调用系统功能。在Android系统中,由于其基于Linux内核,Shell成为连接应用层系统底层的关键桥梁,能够高效执行文件操作、进程管理和系统配置等任务。这一机制为移动应用开发带来了强大的扩展能力,尤其适用于自动化测试、设备状态监控和系统级功能定制等场景。本文聚焦于Android环境下Shell命令执行的技术实现,深入剖析应用沙盒、ADB Shell和系统服务等多层执行环境的权限差异,并探讨如何通过Ru 阅读详情

相关推荐

Shell脚本中命令执行顺序

目录一、分号二、&&三、||四、空 一、分号 执行命令中间的 “分号” 代表命令之间没有逻辑关系,分号连接的命令会按照顺序从前向后依次执行,但分号两端的命令之间没有任何逻辑关系,所有写出来的命令最终都会被执行,即使分号前面的命令出错也不影响后面的命令。 例如:command1 ; command2 二、&& “&&” 表示逻辑。&& 连接的命令会按照顺序从前向后执行,只有当 command1 正确执行执行command2,如果 comma

邓邓子的博客 7623

shell学习系列之父shellshell、脚本执行的几种方式

参考文章: 1)https://blog.csdn.net/NOStandby/article/details/82914930?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.none

daisy2001daisy的博客 2629

掌握Shell编程:编写执行命令文件

本篇博客深入介绍了如何在Unix-like系统中使用shell编写和执行命令文件。从基础的管道命令应用开始,逐步讲解了将命令序列保存到文件并使其可执行的方法,以及如何使用shell变量和注释来增强脚本的功能性和可读性。通过实例演示了如何通过简单的命令创建实用的脚本,例如统计登录用户数和打印系统信息。本文旨在帮助读者理解shell脚本的基础知识,并鼓励他们在日常工作中利用这些知识提高效率。

weixin_33363025的博客 379

Linux中shell运行方式,linux脚本中父shellshell 执行的几种方式

本文要介绍以下几个命令的区别:shellsubshellsource$ (commond)`commond`Linux执行Scripts有两种方式,要区别在于是否建立subshell1. source filename or . filename不创建subshell,在当前shell环境下读取并执行filename中的命令,相当于顺序执行filename里面的命令2. bash filena...

weixin_30923447的博客 216

linux shell shell,Linux下shellshell执行Script的几种方式

Linux登陆机后,在执行Script之前,其实我们已经处于一个shell中,即Login shell。它是将来要执行Script的父shell。如root账号默认为/bin/bash。Linux下每个账号都可以自定义Login shell,在/etc/passwd文件中。Login shell定义在第七个字段,如果这个字段的shell程序不存在、不合法,或执行失败,则无法登陆机。当在执行一个...

weixin_36099503的博客 468

linux-(命令)shell执行语句{命令}本shell执行语句

一. 用{命令}在本shell执行语句 [root@ansible9 ~]# a=1;b=1 [root@ansible9 ~]# { a=2;b=3;cd test;touch 1.txt; } [root@ansible9 test]# cd .. [root@ansible9 ~]# echo $a;echo $b;ll ./1.txt;ll test/1.txt 2 3 ls: cannot access './1.txt': No such file or directory -rw-r--r--

qq_33808440的博客 1299

shell脚本(逻辑&&、逻辑或||、分号;) 成功后执行命令、失败后执行命令、连续执行命令(无论前者成功否)

【代码】shell脚本(逻辑&&、逻辑或||、分号;) 成功后执行命令、失败后执行命令、连续执行命令(无论前者成功否)

Dontla的博客 669

shell 脚本执行命令 source bash 的区别

shell 脚本执行命令 source bash 的区别 执行命令: bash ./filename.sh ./filename.sh (使用SHA BANG 脚本文件#!开头格式) 以上命令是开启一个新进程去执行sh脚本。 source ./filename.sh .filename.sh 以上命令是在当前进程来进行运行。 举个栗: 创建新的shell脚本: # 使用vim命令添加shell脚本 vim test.sh # 编写shell脚本 #! /bin/bash

Fe_cow的博客 3642

说透 Linux Shell命令语法的底层执行逻辑

本文核心是讲透 Linux Shell、Linux 命令Shell 语法的底层逻辑内在关联,并非一份简单的命令查询手册 —— 摒弃上来就堆砌零散的命令用法、罗列冗余的语法参数,而是以「从用户输入指令,到系统执行操作,再到最终返回结果」的完整闭环为核心线索,厘清三者的核心定位协同关系,同时解答 Shell 的形态、运行位置,Linux 命令的分类,以及外部命令执行的核心依赖(PATH 环境变量)等关键疑问,帮助读者建立起有逻辑的整体认知。

2501_93417686的博客 1391

【Linux入门】十三、Shell基础4 -- 多命令执行管道符

十三、Shell基础4 -- 多命令执行管道符 1 多命令顺序执行 执行符 格式 作用 例 ; 命令1 ; 命令2 多个命令顺序执行命令之间没有任何逻辑联系 ls ; date ; cd /hello ; date && 命令1 && 命令2 逻辑命令1正确执行,则命令2才会执行...

OMG 1087

【PHP开发900个实用技巧】59.安全执行外部命令: PHP执行Shell的禁忌技巧!

本文系统剖析PHP执行Shell命令的安全风险防护策略,通过五大核心模块构建完整防御体系: 风险根源:揭示Shell命令执行的本质危险,演示用户输入如何通过分号、反引号等符号实现注入攻击,强调PHP进程权限等同于系统管理员的高危性。 绝对禁忌:剖析直接拼接用户输入导致的灾难案例(如rm -rf /),提出白名单过滤参数分离原则,规范escapeshellarg和escapeshellcmd的使用场景局限。 安全铁律:给出转义函数组合拳方案,结合命令白名单、参数隔离、最小权限原则(专用非root账

803

shell 脚本的执行 echo 命令

脚本执行 1.赋予执行权限,直接运行 chmod 755 hello.sh ./hello.sh #需要使用文件的绝对路径或相对路径 2.通过Bash调用执行脚本 echo输出命令 语法:echo [ -e ] [输出内容] -e :支持反斜线控制的字符转换 eg1:输出hello world! echo 'hello world!' 注意:   如果想要输出...

jx2956的博客 586

执行Shell命令获取命令结果的方法

目录简介1. system2. exec函数簇3. popen()和pclose()无名管道参考 简介 可以执行shell命令的函数: system() exec() popen() 可以获取命令执行结果的方法: popen() 无名管道 1. system NAME system - execute a shell command SYNOPSIS #include <stdlib.h> int system(const char *comma

HideOnLie的博客 1847

Shell命令组合全解析:从顺序执行到后台任务管道应用

在Linux和Unix系统中,Shell命令的组合编排是提升运维和开发效率的核心技能。通过理解命令执行的基本原理,我们可以利用不同的操作符实现复杂的任务自动化。从简单的顺序执行(;)到依赖成功才继续的逻辑(&&),再到失败则补救的逻辑或(||),这些操作符构成了Shell脚本的基石。在技术价值上,它们不仅提升了操作的可靠性,还通过原执行单元减少了人为错误。应用场景广泛覆盖开发环境启动、自动化部署脚本以及日常文件处理。例如,在自动化部署中,结合逻辑操作符可以确保代码拉取、依赖安装、应用构建和服务重启

weixin_34101914的博客 204

从零实现一个简易 Shell:理解 Linux 进程命令执行

本文实现了一个简易Shell程序,具备Linux终端核心功能。该Shell能显示标准提示符([用户名@机名工作目录]#),读取并解析用户输入命令,通过fork创建进程执行外部命令(如ls、pwd等),并等待进程完成。核心模块包括:提示符生成(获取环境变量)、命令读取解析(使用strtok分割参数)、命令执行(fork+execvp组合)。程序采用C++编写,完整复现了Shell的工作流程:循环执行"提示-读取-解析-执行"的经典链路。

2301_80239034的博客 1149

在linux中的shell执行命令进程创建

shell是什么? 维基百科:Unix shell也叫做命令行界面,它是Unix操作系统下传统的用户和计算机的交互界面。用户直接输入命令执行各种各样的任务。 现在的shell不止这些功能,不过,这些本文无关。 shell命令执行过程? 启动shell,本身就是创建一个进程。在shell中运行命令的时候,shell进程会以自己为模板,创建(fork)一个新的进程。这个新建的进程对shell中输入的命令进行处理,处理完之后新进程结束自己的生命,等待shell进程进行回收。具体来说,就是:

jinking01的专栏 5767

Shell脚本的执行命令生效顺序

脚本执行 Shell可以用以下其中一种方法执行: 先赋予脚本文件执行权限,再直接运行 chmod 755 ./hello.sh ./hello.sh 通过Bash调用脚本文件 bash ./hello.sh 命令生效顺序 Linux系统下命令生效的顺序有以下4条: 绝对路径或相对执行命令; 别名; Bash的内部命令; 按照$PATH环境变量定义的目录查找顺序搜到的第一个命令。 ...

Jeffid的博客 5906

Linux source命令sh shell scripts、./执行脚本的区别

source、sh、bash、./执行脚本的区别 网址:http://blog.sina.com.cn/s/blog_61c006ea0100lc3f.html 1、source命令用法:   source FileName   作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"

a746742897的博客 692

深入KtSh核心:Shell命令执行原理架构设计解析

KtSh是一个强大的开源库,专门用于在Android或JVM平台上执行shell命令,为开发者提供了一套完整的shell命令执行解决方案。这个基于Kotlin编写的库不仅简化了shell命令执行流程,还提供了丰富的功能和灵活的配置选项,让开发者能够轻松地在移动端或服务器端执行复杂的shell操作。🎯 ## 📊 KtSh架构设计概览 KtSh的架构设计遵循了现代软件工程的最佳实践,采用了分

gitblog_01147的博客 1005
上一篇: 如何查看shell类型
下一篇: 父 shell,子 shell ,export 与 变量传递
穷游的兔子
博客等级 码龄17年 17粉丝 13原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值