网站首页 > 基础教程 正文
0x00 bash中执行的命令到底是什么?
在bash执行一条简单命令的时候,bash最后执行的不一定是我们所说的存在于$PATH中的文件. 也就是执行echo "hello,world"时,这儿的echo不一定是我们说的存在与/bin或者是/usr/bin下面的那个命令.
在bash中,有如下的四种可以执行东西,他们的优先级从高到低如下
alias function buildin file
0x01 使用type确定命令执行的实体
bash中有内建命令type来确定命令执行的实体,比如echo就有两个实体,第一个是bash内建实现的,第二个是存在于/usr/bin/echo的.
#type -a echo echo is a shell builtin echo is /usr/bin/echo
0x02 通过strace追踪命令执行
为了准确得到执行的echo的实体,我们通过对登录bash进行strace,并开启-f选项(追踪fork出来的进程,也就是子进程),-e选择要追踪的系统调用,折耳追踪clone和write系统调用即可,因为如果有子进程的话,clone会出现,而输出到屏幕实际上是对fd=1的write系统调用.这儿18128是登录bash的PID.
strace -f -p 18128 -e 'clone,write'
直接使用echo
#echo 'hello in builtin' hello in builtin
看到strace的输出,只有write,没有看到clone,说明这个就是bash自己实现的.
完整的给出命令路径
#/usr/bin/echo 'hello in command' hello in command
strace的输出显示18300进程被fork出来了,而且向屏幕输出hello in comand的是fork出来的18300进程.说明这儿执行的是磁盘中的echo命令.
0x03 alias和function
直接使用alias命令可以创建echo的alias
#alias echo='printf "echo in alias"'
此时type -a的输出显示第一个echo已经是这个alias
#type -a echo echo is aliased to `printf "echo in alias"' echo is a shell builtin echo is /usr/bin/echo
此时echo总是会输出echo in alias,因为其优先级最高
#echo 'hello world' echo in alias
再定义一个echo的函数
#function echo () { > printf "echo in function" > }
能看到现在funciton是第二优先级的
#type -a echo echo is aliased to `printf "echo in alias"' echo is a function echo () { printf "echo in function" } echo is a shell builtin echo is /usr/bin/echo
为了使用它,我们需要先使用unalias命令将alias的echo去掉
#unalias echo
此时echo第一优先级的就是fucntion了
#type -a echo echo is a function echo () { printf "echo in function" } echo is a shell builtin echo is /usr/bin/echo
执行echo就是执行定义的函数
#echo echo in function
0xff 总结
在bash中,当执行一条简单命令的时候,实际上执行的可能是alias,function,builtin,file中的一个,对于大部分的命令来说,最后都是执行的file. 但是需要注意file的优先级是最低的,所以如果有时候发现一些命令执行出现了意料之外的情况,可以先使用type -a看下是不是其他类型的实体被执行了.
猜你喜欢
- 2024-10-12 这个为生信学习打造的开源Bash教程真香!!(目录更新)
- 2024-10-12 Shell 函数(杰哥教你Linux) shell中函数
- 2024-10-12 Linux下程序是怎样执行的 linux怎么执行程序
- 2024-10-12 这几个常用 alias,带你高效做事(下)
- 2024-10-12 Shell脚本:函数语法以及实例讲解 shell脚本入门详解
- 2024-10-12 Linux 之 bash 编程 linux bash-4.1
- 2024-10-12 Bash函数:ucase、lcase:借助perl一键转换字符串为大小或小写
- 2024-10-12 Bash Shell制作菜单3部曲:1简单交互菜单|Linux|运维|嵌入式
- 2024-10-12 Bash脚本中的用户交互:暂停、等待按键和倒计时的实现方法
- 2024-10-12 bash问题:是否有函数可以返回字符串的长度?
- 最近发表
-
- 自动脚本操作流程(自动脚本怎么做)
- Ubuntu系统存在严重漏洞,几句命令轻松攻破root权限
- redis实现分布式锁(redis实现分布式锁的原理)
- Linux系统移植之—uboot移植,你们要的uboot终于来了,堪称精品
- powershell 后台运行命令(如何在powershell运行程序)
- 生产环境H200部署DeepSeek 671B 满血版实战(三):SGLang 安装详解
- OpenWrt 小白常用命令大全(openwrt操作命令)
- Linux-shell脚本多线程实现(shell 多线程并发执行)
- Thread.sleep(0):线程休眠0秒有什么意义?
- 40 个简单又有效的 Linux Shell 脚本示例
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)