前言
在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 查看命令类别
==========================================