今天用串口线操作开发板时,由于串口线的问题,输入的命令老有错误显示。再次开机时输入命令时有时提示命令找不到。cd命令可以,ls、vi等命令一律提示命令找不到。
想不通是哪里错了,重新烧录内核还是有一样的问题。我便认为是文件系统什么地方出问题了,想要重新烧录文件系统。可是原来文件系统里的东西便都没了,谨慎起见先给师兄打电话问了一下。结果师兄一席话点醒梦中人。
原来linux中的命令分为内部命令和外部命令:
所謂的內部命令是寫在bash原始碼裡面的(這邊假設談的是bash),你要修改這些內部命令除非透過修改bash的原始碼。
而外部命令才是bash之外自己額外安裝的,比方通常在/bin, /usr/bin, /sbin, /usr/sbin.....等。
例如:type是個內建命令。
- # type type
- type is a shell builtin
- # echo $PATH
- /sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin
- # which type
- which: no type in (/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin)
上面很容易發現,type是個內建命令。
像ls、vi属于外部命令,必须将其所在目录包含进PATH环境变量才能正常使用,而cd、echo属于内部命令,一直都可使用。
我用echo $PATH命令查看了一下PATH环境变量,果然PATH的内容被破坏了。重新将/bin, /usr/bin, /sbin, /usr/sbin等目录加入后恢复正常。
补充:
命令可能是一个关键词(if, while, function, untill等),一个别名(如:alias ll='ls -l'),一个函数(如:function hello { echo "Hello"; }),一个内置命令(cd, type等),应用程序(可执行程序或shell脚本)。
shell会按照命令的类型按先后顺序来执行它们。下面会用实验来检验一下。
以下摘自《Learning the bash shell, 3rd Edition》
1, Aliases
2, Keywords such as function and several others, like if and for
3, Functions
4, Built-ins like cd and type
5, Scripts and executable programs, for which the shell searches in the directories listed in the PATH environment variable