您好,欢迎来到星星旅游。
搜索
您的当前位置:首页shell内建命令和外部命令

shell内建命令和外部命令

来源:星星旅游
shell内建命令和外部命令

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:切换⼯作⽬录

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- stra.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务