前言

在Linux中,我们执行内置命令时,直接输入命令名称即可,如:

 

$ mv 000 000.txt #将000 重命名为000.txt

 

而在执行自己写好的程序时,却要带上./,例如:

$ helloworld
helloworld: command not found

$ ./helloworld
str1=192.168.2.6

为什么会这样?很多人可能就直接认为是环境变量没有加入这个可执行程序,对的,你没错,但是你不全面,首先,我们需要知道shell是如何执行程序的

 

shell如何执行程序

首先我们必须要清楚的是,执行一条Linux命令,本质是在运行一个程序,

如执行ls命令,它执行的是ls程序。

那么在shell中输入一条命令,到底发生了什么?它会经历哪几个查找过程?

如果不给出相对路径,或者绝对路径,那么它会经历下面的查找过程。

 

一、alias中查找

alias命令可用来设置命令别名

输入alias可以查看到已设置的别名

$ alias 
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
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命令可以看到有哪些内置命令,通过type命令可以查看命令类型:

 

$ help 

$ type grep 
grep is aliased to `grep --color=auto'  

$ type echo 
echo is a shell builtin

 

三、PATH环境变量中查找

以ls为例,在shell输入ls时,首先它会从PATH环境变量中查找:

会在环境变量里指定的目录去运作ls可执行程序,找到的第一个会被执行

使用 whereis 命令也可以找到程序的位置

$ whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

既然它是在/usr/bin目录下,那么我把ls从bin目录下移走是不是就找不到了呢?-----是的,会提示你命令找不到

所以你现在明白为什么第一次安装jdk或者python的时候要设置环境变量了吧?不设置的话行不行?-----行。这个时候你就需要指定路径了。

如果这时候,还没找到程序所在的目录,此时就会报错,需要确定该程序对应的解释器

 

四、确认解释程序

在找到程序之后呢,需要确定解释程序。什么意思呢?

shell通常可以执行两种程序,一种是二进制程序,一种是脚本程序。

而一旦发现要执行的程序文件是文本文件,且文本未指定解释程序,那么就会默认当成shell脚本来执行。例如,假设有test.txt内容如下:

echo -e "hello world"

赋予执行权限并执行:

$ chmod +x test.txt
$ ./test.txt
hello world

当然了,我们通常会在shell脚本程序的来头带上下面这句,告诉shell,你要用bash程序来解释执行test.txt。

#!/bin/bash

如果开头改成python呢?

#!/usr/bin/python

再次执行之后结果如下(会报错,因为语法不符合python语法):

$ ./test.txt 
  File "./test.txt", line 3
    echo -e "hello world"
                        ^
SyntaxError: invalid syntax

那么如果是二进制程序呢?就会使用execl族函数去创建一个新的进程来运行新的程序了。

 

小结一下:

如果是文本程序,且开头没有指定解释程序,则按照shell脚本处理

如果指定了解释程序,则使用解释程序来解释运行;

对于二进制程序,则直接创建新的进程即可。

 

5、运行

linux的后缀不是扩展名,只是个文件标识罢了,没有特殊的含义,任何文件只有有权限,都可以被执行

$ sh test.txt
$ . test.txt

==========================================

扩展一下

那么如果让我们自己的程序也能够像Linux内置命令一样输入即可被识别呢?

1、将程序放到PATH路径下,直接加上路径执行,或者

2、加环境变量

3、设置别名

==========================================

总结

说到这里,想必标题的问题以及下面的问题你都清楚了:

  • 安装Python或者Jdk程序为什么要设置PATH环境变量?如果不设置,该如何运行?
  • 除了./方式运行自己的程序还有什么方式?
  • 如果让自己的程序能够像内置命令一样被识别?
  • 如何查看文件类型?
  • 执行一条命令,如何确定是哪里的命令被执行

本文涉及命令

  • mv 移动/重命名
  • file 查看文件信息
  • whereis 查看命令或者手册位置
  • type 查看命令类别

==========================================