首发:公众号【编程珠玑】
作者:守望先生
ID:shouwangxiansheng
前言
在Linux中,我们执行内置命令时,直接输入命令名称即可,如:
$ mv a b #将a重命名为b
而在执行自己写好的程序时,却要带上./,例如:
$ hello
hello: command not found
$ ./hello
hello world
这是为什么呢?它们有什么区别呢?
shell是如何运行程序的
在说明清楚问题之前,我们必须了解shell是如何运行程序的。首先我们必须要清楚的是,执行一条Linux命令,本质是在运行一个程序,如执行ls命令,它执行的是ls程序。那么在shell中输入一条命令,到底发生了什么?它会经历哪几个查找过程?
alias中查找
alias命令可用来设置命令别名,而单独输入alias可以查看到已设置的别名:
$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
如果这里没有找到你执行的命令,那么就会接下去查找。如果找到了,那么就会执行下去。
内置命令中查找
不同的shell包含一些不同的内置命令,通常不需要shell到磁盘中去搜索。通过help命令可以看到有哪些内置命令:
$ help
通过type 命令可以查看命令类型:
$ type echo
echo is a shell builtin
如果是内置命令,则会直接执行,否则继续查找。
PATH中查找
以ls为例,在shell输入ls时,首先它会从PATH环境变量中查找,PATH内容是什么呢,我们看看:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/b