strace命令_bash中命令执行的优先级

0x00 bash中执行的命令到底是什么?

在bash执行一条简单命令的时候,bash最后执行的不一定是我们所说的存在于$PATH中的文件. 也就是执行echo "hello,world"时,这儿的echo不一定是我们说的存在与/bin或者是/usr/bin下面的那个命令.

在bash中,有如下的四种可以执行东西,他们的优先级从高到低如下

aliasfunctionbuildinfile

0x01 使用type确定命令执行的实体

bash中有内建命令type来确定命令执行的实体,比如echo就有两个实体,第一个是bash内建实现的,第二个是存在于/usr/bin/echo的.

#type -a echoecho is a shell builtinecho 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'
2c91c04005386620fbd84d8157c12f27.png

直接使用echo

#echo 'hello in builtin'hello in builtin

看到strace的输出,只有write,没有看到clone,说明这个就是bash自己实现的.

7790d974abe4945a26a5fdf678cfe588.png

完整的给出命令路径

#/usr/bin/echo 'hello in command'hello in command

strace的输出显示18300进程被fork出来了,而且向屏幕输出hello in comand的是fork出来的18300进程.说明这儿执行的是磁盘中的echo命令.

2d10f84014f03fe3730581fac5844373.png

0x03 alias和function

直接使用alias命令可以创建echo的alias

#alias echo='printf "echo in alias"'

此时type -a的输出显示第一个echo已经是这个alias

#type -a echoecho is aliased to `printf "echo in alias"'echo is a shell builtinecho is /usr/bin/echo

此时echo总是会输出echo in alias,因为其优先级最高

#echo 'hello world'echo in alias

再定义一个echo的函数

#function echo () {> printf "echo in function"> }

能看到现在funciton是第二优先级的

#type -a echoecho is aliased to `printf "echo in alias"'echo is a functionecho (){ printf "echo in function"}echo is a shell builtinecho is /usr/bin/echo

为了使用它,我们需要先使用unalias命令将alias的echo去掉

#unalias echo

此时echo第一优先级的就是fucntion了

#type -a echoecho is a functionecho (){ printf "echo in function"}echo is a shell builtinecho is /usr/bin/echo

执行echo就是执行定义的函数

#echoecho in function

0xff 总结

在bash中,当执行一条简单命令的时候,实际上执行的可能是alias,function,builtin,file中的一个,对于大部分的命令来说,最后都是执行的file. 但是需要注意file的优先级是最低的,所以如果有时候发现一些命令执行出现了意料之外的情况,可以先使用type -a看下是不是其他类型的实体被执行了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值