bash shell 父子关系及内外命令

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

目录

shell 类型

shell 的父子关系

进程列表

后台模式

将进程列表置入后台

协程

shell的内建命令

外部命令

内建命令


shell 类型

系统启动什么样的shell程序取决于你个人的用户ID配置。在/etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序。只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。
 

$ cat /etc/passwd
[...]
Christine:x:501:501:Christine B:/home/Christine:/bin/bash
$

CentOS发行版中还有其他一些shell程序。其中包括tcsh、ash shell、csh等。他们的程序位于/bin目录内

$ ls -lF /bin/bash
-rwxr-xr-x. 1 root root 938832 Jul 18 2013 /bin/bash*
$ls -lF /bin/tcsh
-rwxr-xr-x. 1 root root 387328 Feb 21 2013 /bin/tcsh*
$ls -lF /bin/dash
-rwxr-xr-x. 1 root root 109672 Oct 17 2012 /bin/dash*
$ls -lF /bin/csh
lrwxrwxrwx. 1 root root 4 Mar 18 15:16 /bin/csh -> tcsh*
$

要使用其他可用的shell,只需要输入对应的文件名就行了 

$ /bin/dash
$
$ exit
exit
$

shell 的父子关系

终端仿真器时所启动的默认的交互shell,是一个父shell。在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。

$ ps -f
UID PID PPID C STIME TTY TIME CMD
501 1841 1840 0 11:50 pts/0 00:00:00 -bash
501 2532 1841 1 14:22 pts/0 00:00:00 ps -f
$
$ bash
$
$ bash
$
$ bash
$
$ ps --forest
PID TTY TIME CMD
1841 pts/0 00:00:00 bash
2533 pts/0 00:00:00     \_ bash
2546 pts/0 00:00:00         \_ bash
2562 pts/0 00:00:00             \_ bash
2576 pts/0 00:00:00                 \_ ps
$
  • 进程列表

要是想在一行中指定要依次运行的一系列命令。这可以通过命令列表来实现,只需要在命令之间加入分号(;)

$ pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls
/home/Christine
Desktop Downloads Music Public Videos
Documents junk.dat Pictures Templates
/etc
/home/Christine
Desktop Downloads Music Public Videos
Documents junk.dat Pictures Templates
$

上述命令依次执行。但这并不是进程列表。命令列表要想成为进程列表,这些命令必须包含在括号里。括号的加入使
命令列表变成了进程列表,生成了一个子shell来执行对应的命令。

$ (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)
/home/Christine
Desktop Downloads Music Public Videos
Documents junk.dat Pictures Templates
/etc
/home/Christine
Desktop Downloads Music Public Videos
Documents junk.dat Pictures Templates
$

我们利用命令echo $BASH_SUBSHELL来检查是否生成子shell,该命令返回0,就表明没有子shell。如果返回
1或者其他更大的数字,就表明存在子shell。

$ ( pwd ; echo $BASH_SUBSHELL)
/home/Christine
1
$ ( pwd ; (echo $BASH_SUBSHELL))
/home/Christine
2
  • 后台模式

在后台模式中运行命令可以在处理命令的同时让出CLI,以供他用;你既可以在子shell中进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。。演示后台模式的一个经典命令就是sleep。sleep命令接受一个参数,该参数是你希望进程等待(睡眠)的秒数。要想将命令置入后台模式,可以在命令末尾加上字符&

$ sleep 3000&
[1] 2396
$ ps -f
UID PID PPID C STIME TTY TIME CMD
christi+ 2338 2337 0 10:13 pts/9 00:00:00 -bash
christi+ 2396 2338 0 10:17 pts/9 00:00:00 sleep 3000
christi+ 2397 2338 0 10:17 pts/9 00:00:00 ps -f
$

第一条信息是显示在方括号中的后台作业(background job)号(1)。第二条是后台作业的进程ID(2396)。jobs命令可以显示出当前运行后台模式中的所有用户的进程(作业)。

$ jobs
[1]+ Running sleep 3000 &
$ jobs -l
[1]+ 2396 Running sleep 3000 &
$

一旦后台作业完成,就会显示出结束状态

[1]+ Done sleep 3000 &
  • 将进程列表置入后台

$ (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)&
[2] 2401
$ 1
[2]+ Done ( sleep 2; echo $BASH_SUBSHELL; sleep 2 )
$

使用tar创建备份文件是有效利用后台进程列表的一个更实用的例子。

$ (tar -cf Rich.tar /home/rich ; tar -cf My.tar /home/christine)&
[3] 2423
$
  • 协程

携程可以同时做两件事情,在后台生成一个子shell,并在子shell中执行命令。利用coproc命令进行协程处理。

$ coproc sleep 10
[1] 2544
$ jobs
[1]+ Running coproc COPROC sleep 10 &

将协程与进程列表结合起来产生嵌套的子shell

$ coproc (sleep 10;sleep 2)
[1] 2574
$ jobs
[1]+ Running coproc COPROC ( sleep 10; sleep 2 ) &
$ ps --forest
PID TTY TIME CMD
2483 pts/12 00:00:00 bash
2574 pts/12 00:00:00   \_ bash
2575 pts/12 00:00:00 |    \_ sleep
2576 pts/12 00:00:00         \_ ps

shell的内建命令

  • 外部命令

外部命令,也称文件系统命令,存在于bash shell之外的程序。不是shell程序的一部分。外部命令程序通常位于/bin; /usr/bin; /sbin; /usr/sbin中。ps就是外部命令,使用whichtype找到他。

$ which ps
/bin/ps
$ type -a ps
ps is /bin/ps
$ ls -l ps
-rwxr-xr-x 1 root root 93232 Jan 6 18:32 /bin/ps

作为外部命令,ps执行时会创建一个子进程

  • 内建命令

内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。

$ type cd
cd is a shell builtin
$ type exit
exit is a shell builtin

有些命令有多种实现。例如echo和pwd既有内建命令也有外部命令。两种实现略有不同。要查看命令的不同实现,使用type命令的-a选项。which命令只显示出了外部命令文件

$ type -a echo
echo is a shell builtin
echo is /bin/echo
$ which echo
echo is /bin/echo

history命令。bash shell会跟踪你用过的命令。你可以唤回这些命令并重新使用。

$ history
1 ps -f
2 pwd
[...]

命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。

$ cat .bash_history

唤回历史列表中任意一条命令。只需输入惊叹号和命令在历史列表中的编号即可

$ history
[...]
20 type -a pwd
$ !20
type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
$

alias命令允许你为常用的命令及参数创建另一个名称,从而减少输入量,你所使用的Linux发行版很有可能已经为你设置好了一些常用命令的别名。要查看当前可用的别名,使用alias命令以及选项-p。

$ alias -p
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

可以使用alias命令创建属于自己的别名

$ alias li='ls -li'
$ li

 

LinuxShell编程1———shell基础命令 可以由字母、数字、下划线组成, 不能以数字开头, 不能是关键字,见名知意。变量名=“变量值” 或者 变量名=变量值注意:变量名与变量值等号之间不能有空格,不然就定义失败。调用(提取)变量:$变量名 或${变量名}Shell数组用括号来表示,元素用空格分割开,语法格式:定义数组 :数组名=(值1 值2 ... 值n)$@内置变量,脚本外输的变量值,我们就调用这个函数进行判断。返回值0是服务开启,非0是未开启。修改颜色添加时间sed是一个用于:过滤并转换文本行的流编辑器。 阅读详情

相关推荐

Bash Shell控制台终端命令合集

最近整理了一下Bash Shell终端的命令,以备后续查用。

栖鹤小筑 993

shell以及什么时候进入shell

最近写shell脚本程序,碰到一个问题:需要一个全局变量来反复保存和更新一些统计信息,但每次在shell主程序的函数中更新完后,主程序中的值却没有变化,仍是初始值 后来发现执行更新操作的函数是后台执行的,若将其变成前台执行则全局变量每次都可以顺利更新和保存。 查得下面这篇文章,原来后台执行的函数是在shell中执行的,shell进程一样,都是单通的,shell所继承的shell变量是一个副本,其改动只在shell中生效,并不会影响shell,要想将其回传shell,则需要考虑进程间

团长的专栏 1433

Bash命令Shell操作详解

本文详细解析了Bash命令Shell操作,包括路径处理、文件管理、文本处理、查找与统计等内容,涵盖了`ls`、`cd`、`rm`、`cp`、`mv`、`grep`、`find`、`wc`等常用命令的使用场景和操作技巧,适合需要掌握命令行操作的Linux用户和开发者。

v5w6x的博客 950

什么是Bash、什么是shell

什么是Shell? shell是用户和Linux(或者更准确的说,是用户和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。 shell 是一个命令语言解释器(command-language interpreter)...

程序猿进化梯 1365

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中常用的基础命令

我们常常会用到shell脚本,在我们的学习过程中,比如我们常见的视频脚本、搜索脚本等等,所以从今天就开始学习shell脚本,这一节主要来学习shell脚本中的基础命令

moumumu的博客 2224

Linux命令行-第5章@懂我bash shell命令①-父子关系

注意,shell进程ID(PPID)是1841,指明了这个shell进程就是该shell进程。对bash shell脚本来说,这两种不同的shell(默认的交互shell和默认的系统shell)会造成问题。在交互式的CLI shell会话中,shell同样存在问题。不过还有另外一个默认shell是/bin/sh,它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。当输入bash、生成shell的时候,你是看不到任何相关的信息的,因此需要另一条命令帮助我们理清这一切。

华为奋斗者精神 2378

bash命令_linux反弹shellbash命令解析

当我们在渗透Linux主机时,反弹一个可交互的shell是非常有必要的。那什么反弹shell又到底是什么呐?为什么要反弹shell呐?一、什么是反弹shell?反弹shell(reverse shell),就是控制端(攻击者所有)监听某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转发到控制端。reverse shell与telnet,ssh等标准shell对应,本质...

weixin_39529302的博客 3569

ShellBash

shell是一个命令语言解释器,是用户和Linux内核之间的接口程序,用户在提示符下输入的每个命令都由shell先解释然后再传给Linux内核(如图)。当用户成功登入系统后shell就启动了,并始终作为你与系统内核的交互手段直至你退出系统。Bash(Bourne Again shell )是目前最常用的一种shell,也是当前大多数Linux发行版的默认Shell。除此之外还有Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)等。

weixin_72517329的博客 3566

Bash反弹shell

机器名称机器IP攻击机器实验靶机Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语 言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动 态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本 的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。python反弹shell介绍python2s.connect(("攻击机器IP",端口));机器名称。

qq_64177395的博客 1445

Bash Shell 脚本基础

现在我们已经知道了Linux系统和命令行的基础知识了,是时候开始编程了。在此之前先了解一些基本概念: 从字面上的意思来说:kernel 是[ 核心 ]的意思,而 shell 是[ 壳 ]的意思,核心是操作系统最底层的东西,里面包括了各种的支持硬件的工具!基本上替我们工作的是[ 硬件 ],而控制硬件的是[ 核心 ],我们使用者就是利用[ Shell ]控制一些 Kernel 提供的[ 工具(Ut...

陳Huid的博客 954

【Linux】Linux Bash Shell 教程

Linux bash(Bourne-Again SHell)是一种为GNU操作系统编写的命令行解释器,它是大多数Linux发行版中最常用的shellBash提供了一种强大的方式来控制和管理操作系统,支持命令历史记录、别名、管道、重定向、变量、条件判断、循环以及自定义脚本编写等功能,使得用户能够通过简单的命令行指令执行复杂的任务,是系统管理员和开发人员日常工作中的得力工具。

Young_Pro的博客 2489

bash shell中并行运行命令

介绍 三种方式可以并行运行命令 使用parallel命令 结合使用&和wait命令 使用xargs命令 放任务到后端 command & command arg1 arg2 & custom_function & 或者 prog1 & prog2 & wait prog3 上面的代码是:当prog1和prog2运行完成后,prog3才会开始运...

fengfengzai0101的博客 2668

shell命令bash

bash

点点滴滴 1513

BashShell

BashShell同为命令行解释器,二者的区别。

m0_64196863的博客 1145

linux系统下的bash shell指令有哪些?对bash命令的汇总和小结

一、参考来源 Windows系统的cmd命令哪些?具体怎么用?cmd命令汇总,dos命令小结?和linux 二、基础概念 2.1 SHELL:壳,连接用户和Linux内核,命令行解释器。 2.2 BASHshell的一种,属于linux系统的概念,linux系统下的“黑窗口”就叫作Bash shell。 2.3 DOS:磁盘操作系统,Windows模拟了DOS系统,dos命令是该系统下的底层交互命令。 2.4 BAT文件:BAT是batch的简称,bat文件是一种批处.

小坏蛋的博客 8813

bash 不是内部或外部命令_Shell编程之bash

【133】 Shell是一个命令行工具。Shell(也称为终端或者壳)充当的是人与内核(硬件)之间的翻译官。用户报一些命令“告诉”终端,他就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流的Linux系统默认使用的终端是Bash(Bourne Again SHell)解释器。 一、bash的优势通过上下方向键来调取过往执行过得Linux命令命令或参数仅需要输入前几位就可以用Ta...

weixin_42627853的博客 8233

Bashshell

一、什么是shell,什么是bash? 管理计算机硬件的其实是内核,用户正是通过shell来跟内核通信的,从本质上说shell是一个能执行各种命令的宏处理器。而bash(/bin/bash)就是linux默认的shell。 ...

myp的博客 9345

shell以及shellbash的关系

1. 什么是shell shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。 shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。 不论何时你键入一个命令,它都被Linux sh

sally的jerry 1138
上一篇: bash shell 进程与磁盘数据
下一篇: bash shell 环境变量
linlinlinle
博客等级 码龄10年 5粉丝 50原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值