针对不同平台/语言下的命令执行是不相同的,存在很大的差异性。因此,这里对不同平台/语言下的命令执行函数进行深入的探究分析。
文章开头会对不同平台(Linux、Windows)下:终端的指令执行、语言(PHP、Java、Python)的命令执行进行介绍分析。后面,主要以PHP语言为对象,针对不同平台,对命令执行函数进行底层深入分析,这个过程包括:PHP内核源码的编译、运行、调试、审计等,其它语言分析原理思路类似。19
该系列分析文章主要分为四部分,如下:
- 第一部分:命令执行底层原理探究-PHP (一)
针对不同平台(Linux、Windows)下:终端的指令执行、语言(PHP、Java、Python)的命令执行进行介绍分析。
- 第二部分:命令执行底层原理探究-PHP (二)
主要以PHP语言为对象,针对不同平台,进行环境准备、PHP内核源码的编译、运行、调试等。
- 第三部分:命令执行底层原理探究-PHP (三)
针对Windows平台下,PHP命令执行函数的底层原理分析。
- 第四部分:命令执行底层原理探究-PHP (四)
针对Linux平台下,PHP命令执行函数的底层原理分析。
本文《 命令执行底层原理探究-PHP (一) 》主要讲述的是第一部分:针对不同平台(Linux、Windows)下:终端的指令执行、语言(PHP、Java、Python)的命令执行进行介绍分析。
平台语言不同平台终端指令执行不同平台终端中执行的命令方式一般有两种:自身终端封装的指令(内置)、终端下调用其它目录下的可执行程序(外部)。
LinuxLinux下终端一般为/bin/bash、/bin/sh、/bin/zsh等,这里以bash终端为例测试。
以Linux为例【Windows等平台原理同Linux类似】,Linux下终端内建(内置)的指令类型为:shell built-in command。
所谓shell built-in command,就是那些内建在linux shell里面的command指令。
通常情况下,在linux shell下面执行一个command指令,shell会查找command是否为built-in command类型,对于built-in command指令类型,shell会自己解释执行,而无需fork一个child process子进程来执行该command指令;对于,不是built-in command指令类型,shell会从环境变量中按顺序搜索该command指令,如果能查到则会fork一个child process子进程来执行该command指令;然而,对于找不到的command指令,一般为:执行的指令不存在、指令未加入到环境变量中。
那么如何进行终端内建指令的判断与查看呢,对于内建指令可以使用type指令去判断
┌──(roottoor)-[~/桌面]
└─# type echo
echo is a shell builtin
┌──(roottoor)-[~/桌面]
└─# type whoami
whoami is /usr/bin/whoami
┌──(roottoor)-[~/桌面]
└─#
或着也可以使用其它指令进行查找判断:which、where
┌──(roottoor)-[~/桌面]
└─# which echo
echo: shell built-in command
┌──(roottoor)-[~/桌面]
└─# which whoami
/usr/bin/whoami
┌──(roottoor)-[~/桌面]
└─#
┌──(roottoor)-[~/桌面]
└─# where echo
echo: shell built-in command
echo
/bin/echo
┌──(roottoor)-[~/桌面]
└─# where whoami
/usr/bin/whoami
/bin/whoami
┌──(roottoor)-[~/桌面]
└─#
注意:在Linux平台,有些命令虽然为内建命令,但是系统关键目录也存在其可执行文件。
这里也可以使用enable或help指令,查看终端内建的所有指令
- 第一种:enable指令
┌──(roottoor)-[~/桌面]
└─# enable
-
.
:
[
alias
autoload
bg
bindkey
break
builtin
bye
cd
chdir
command
compadd
comparguments
compcall
compctl
compdescribe
compfiles
compgroups
compquote
compset
comptags
comptry
compvalues
continue
declare
dirs
disable
disown
echo
echotc
echoti
emulate
enable
eval
exec
exit
export
false
fc
fg
float
functions
getln
getopts
hash
history
integer
jobs
kill
let
limit
local
log
logout
noglob
popd
print
printf
private
pushd
pushln
pwd
r
read
readonly
rehash
return
sched
set
setopt
shift
source
suspend
test
times
trap
true
ttyctl
type
typeset
ulimit
umask
unalias
unfunction
unhash
unlimit
unset
unsetopt
vared
wait
whence
where
which
zcompile
zformat
zle
zmodload
zparseopts
zregexparse
zstat
zstyle
┌──(roottoor)-[~/桌面]
└─#
- 第二种:help指令
接着对终端(内置|外置)命令进行测试,测试终端/bin/zsh:
- 测试:whoami指令
先对whoami指令进行类型探测与指令定位查询
# 指令探测:非内置指令
┌──(roottoor)-[~/桌面]
└─# type whoami
whoami is /usr/bin/whoami
┌──(roottoor)-[~/桌面]
└─#
# 指令定位查询:搜索发现系统特殊目录存在`whoami`可执行程序
┌──(roottoor)-[~/桌面]
└─# where whoami
/usr/bin/whoami
/bin/whoami
┌──(roottoor)-[~/桌面]
└─#
注意:/bin目录为/usr/bin目录的链接
然后,在zsh终端写入For循环执行whoami指令查看是否为内部执行或外部调用
for n in {0..10000000}; do whoami ; done
另一侧,使用htop动态进程监控程序对该终端进行监控,可发现whoami指令并非zsh终端内置封装的指令
- 测试:echo指令
同样,对echo指令进行类型探测与指令定位查询
# 指令探测:内置指令
┌──(roottoor)-[~/桌面]
└─# type echo
echo is a shell builtin
┌──(roottoor)-[~/桌面]
└─#
# 指令定位查询:搜索发现系统特殊目录存在`echo`可执行程序,同时还发现存在`echo: shell built-in command`【终端内置指令】
┌──(roottoor)-[~/桌面]
└─# where echo
echo: shell built-in command
/usr/bin/echo
/bin/echo
┌──(roottoor)-[~/桌面]
└─#
然后,在zsh终端写入For循环执行echo指令查看是否为内部执行或外部调用
for n in {0..10000000}; do echo 1 ; done
另一侧,使用htop动态进程监控程序对该终端进行监控,可以发现echo指令为zsh终端内置封装的指令,并未出现外部调用