shell内建命令和外部命令
今天在使⽤Java的Runtime.exe()执⾏⼀个Linux命令的时候,出现了错误,通过问题的解决学习到了shell的内建命令和外部命令的差别。问题:
使⽤如下Java代码执⾏⼀个命令的时候,报错提⽰说:不能运⾏source命令,原因是不存在该⽂件或⽬录。
String cmd = \"source activate tensorflow\";
Process pr = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getErrorStream()));String line;
while ((line = in.readLine()) != null) { System.out.println(line);}
in.close();pr.waitFor();
我将前⾯代码中的cmd修改为cmd = \"ls -l\",发现能正常运⾏。
百思不得其解,本来对linux不是很熟悉,通过搜索引擎找到了答案,。
原来,source命令是shell的⼀个built-in命令,当我在⼀个java进程中以Runtime的⽅式去执⾏⼀个命令时候,实际上是新开了⼀个⼦进程sub去执⾏该命令,⽽这个sub进程不是shell进程,因此只能执⾏⾮shell内建命令(关于常见的内建命令后⾯会总结)。
shell是⼀个程序,允许我们通过它和操作系统进⾏交互,当我们在shell中执⾏的是内建命令,该命令直接在shell进程中执⾏,⽽如果执⾏的
是外部命令,shell进程则会fork出⼀个新的⼦进程来执⾏外部命令。所以内建命令能够被执⾏的前提是需要存在⼀个shell进程。
内建命令和外部命令
shell内建命令是shell程序提供的⼀些命令,⽽外部命令是其他独⽴的程序(这些独⽴的程序和shell同级)。通常我们在shell中直接输⼊⼀个命令,我们并不能直接看出这些命令哪些是内建命令,哪些是外部命令?例如:
cd /root
和
ls -l
以上我们⽆法区分哪个是内建命令(cd是shell内建命令,ls是外部命令)。那么如何怎么判断哪些命令是内建命令还是外部命令呢? 通常使⽤which name或者type name即可判断得出。例如 1.
which mkdir
输出
/bin/mkdir
2.
which source
输出
source: shell built-in command
如何使⽤内建命令
内建命令可以紧跟shell命令后⾯,让shell程序去解释执⾏该命令。 形如:
sh cmd-namebash cmd-namezsh cmd-name
另外常见的shell还可以增加⼀些参数,例如
bash -c \"ls -l\"
常见的shell参数:
-c string:命令从-c后的字符串读取。-i:实现脚本交互。
-n:进⾏shell脚本的语法检查。
-x:实现shell脚本逐条语句的跟踪。
常见的shell内建命令
source:在当前bash环境下读取并执⾏指定的命令echo:输出指定的字符串或者变量type:显⽰指定命令的类型
env:显⽰系统中已存在的环境变量exec:调⽤并执⾏指定的命令kill:删除执⾏中的程序或⼯作alias:⽤来设置指令的别名unalias:⽤来删除指令的别名exit:退出当前的shell
jobs:显⽰linux的任务列表和状态history:显⽰历史命令
logout:退出当前登录的shell
export:设置或者显⽰当前登录的shellcd:切换⼯作⽬录
因篇幅问题不能全部显示,请点此查看更多更全内容