linux常用的20个命令(详细语法实例)

玩过Linux的人都会知道,Linux中的指令的确是十分多,下面就说说我最常用的Linux指令。

1、cd指令

这是一个十分根本,也是咱们经常需求运用的指令,它用于切换当时目录,它的参数是要切换到的目录的途径,可所以绝对途径,也可所以相对途径。如:

cd/root/Docements#切换到目录/root/Docements

cd./path#切换到当时目录下的path目录中,“.”表明当时目录

cd../path#切换到上层目录中的path目录中,“..”表明上一层目录

2、ls指令

这是一个十分有用的检查文件与目录的指令,list之意,它的参数十分多,下面就列出一些我常用的参数吧,如下:

-l:列出长数据串,包含文件的特点与权限数据等

-a:列出悉数的文件,连同隐藏文件(最初为.的文件)一同列出来(常用)

-d:仅列出目录自身,而不是列出目录的文件数据

-h:将文件容量以较易读的方法(GB,kB等)列出来

-R:连同子目录的内容一同列出(递归列出),等于该目录下的一切文件都会显示出来

注:这些参数也能够组合运用,下面举两个比如:

ls-l#以长数据串的方法列出当时目录下的数据文件和目录

ls-lR#以长数据串的方法列出当时目录下的一切文件

3、grep指令

该指令常用于分析一行的信息,若当中有咱们所需求的信息,就将该行显示出来,该指令一般与管道指令一同运用,用于对一些指令的输出进行挑选加工等等,它的简略语法为

grep[-acinv][–color=auto]’查找字符串’filename

它的常用参数如下:

-a:将binary文件以text文件的方法查找数据

-c:计算找到‘查找字符串’的次数

-i:疏忽大小写的区别,即把大小写视为相同

-v:反向挑选,即显示出没有‘查找字符串’内容的那一行

#例如:

#取出文件/etc/man.config中包含MANPATH的行,并把找到的关键字加上颜色

grep–color=auto’MANPATH’/etc/man.config

#把ls-l的输出中包含字母file(不区分大小写)的内容输出

ls-l|grep-ifile

4、find指令

find是一个根据查找的功能十分强大的指令,相对而言,它的运用也相对较为杂乱,参数也比较多,所以在这儿将给把它们分类列出,它的根本语法如下:

find[PATH][option][action]

#与时刻有关的参数:

-mtimen:n为数字,意思为在n天之前的“一天内”被更改正的文件;

-mtime+n:列出在n天之前(不含n天自身)被更改正的文件名;

-mtime-n:列出在n天之内(含n天自身)被更改正的文件名;

-newerfile:列出比file还要新的文件名

#例如:

find/root-mtime0#在当时目录下查找今日之内有改动的文件

#与用户或用户组名有关的参数:

-username:列出文件一切者为name的文件

-groupname:列出文件所属用户组为name的文件

-uidn:列出文件一切者为用户ID为n的文件

-gidn:列出文件所属用户组为用户组ID为n的文件

#例如:

find/home/ljianhui-userljianhui#在目录/home/ljianhui中找出一切者为ljianhui的文件

#与文件权限及称号有关的参数:

-namefilename:找出文件名为filename的文件

-size[+-]SIZE:找出比SIZE还要大(+)或小(-)的文件

-tpyeTYPE:查找文件的类型为TYPE的文件,TYPE的值首要有:一般文件(f)、设备文件(b、c)、

目录(d)、连接文件(l)、socket(s)、FIFO管道文件(p);

-permmode:查找文件权限刚好等于mode的文件,mode用数字表明,如0755;

-perm-mode:查找文件权限必须要悉数包含mode权限的文件,mode用数字表明

-perm+mode:查找文件权限包含任一mode的权限的文件,mode用数字表明

#例如:

find/-namepasswd#查找文件名为passwd的文件

find.-perm0755#查找当时目录中文件权限的0755的文件

find.-size+12k#查找当时目录中大于12KB的文件,留意c表明byte

5、cp指令

该指令用于仿制文件,copy之意,它还能够把多个文件一次性地仿制到一个目录下,它的常用参数如下:

-a:将文件的特性一同仿制

-p:连同文件的特点一同仿制,而非运用默认方法,与-a类似,常用于备份

-i:若方针文件现已存在时,在掩盖时会先问询操作的进行

-r:递归持续仿制,用于目录的仿制行为

-u:方针文件与源文件有差异时才会仿制

例如:

cp-afile1file2#连同文件的一切特性把文件file1仿制成文件file2

cpfile1file2file3dir#把文件file1、file2、file3仿制到目录dir中

6、mv指令

该指令用于移动文件、目录或更名,move之意,它的常用参数如下:

-f:force强制的意思,假如方针文件现已存在,不会问询而直接掩盖

-i:若方针文件现已存在,就会问询是否掩盖

-u:若方针文件现已存在,且比方针文件新,才会更新

注:该指令能够把一个文件或多个文件一次移动一个文件夹中,但是最终一个方针文件必定要是“目录”。

例如:

mvfile1file2file3dir#把文件file1、file2、file3移动到目录dir中

mvfile1file2#把文件file1重命名为file2

7、rm指令

该指令用于删去文件或目录,remove之间,它的常用参数如下:

-f:便是force的意思,疏忽不存在的文件,不会出现警告音讯

-i:互动模式,在删去前会问询用户是否操作

-r:递归删去,最常用于目录删去,它是一个十分危险的参数

例如:

rm-ifile#删去文件file,在删去之前会问询是否进行该操作

rm-frdir#强制删去目录dir中的一切文件

8、ps指令

该指令用于将某个时刻点的进程运转状况选取下来并输出,process之意,它的常用参数如下:

-A:一切的进程均显示出来

-a:不与terminal有关的一切进程

-u:有用用户的相关进程

-x:一般与a参数一同运用,可列出较完好的信息

-l:较长,较详细地将PID的信息列出

其实咱们只要记住ps一般运用的指令参数调配即可,它们并不多,如下:

psaux#检查体系一切的进程数据

psax#检查不与terminal有关的一切进程

ps-lA#检查体系一切的进程数据

psaxjf#检查连同一部分进程树状况

9、kill指令

该指令用于向某个作业(%jobnumber)或者是某个PID(数字)传送一个信号,它一般与ps和jobs指令一同运用,它的根本语法如下:

kill-signalPID

signal的常用参数如下:

注:最前面的数字为信号的代号,运用时能够用代号替代相应的信号。

1:SIGHUP,发动被停止的进程

2:SIGINT,相当于输入ctrl+c,中止一个程序的进行

9:SIGKILL,强制中止一个进程的进行

15:SIGTERM,以正常的完毕进程方法来停止进程

17:SIGSTOP,相当于输入ctrl+z,暂停一个进程的进行

例如:

#以正常的完毕进程方法来总算第一个后台作业,可用jobs指令检查后台中的第一个作业进程

kill-SIGTERM%1

#重新改动进程ID为PID的进程,PID可用ps指令经过管道指令加上grep指令进行挑选取得

kill-SIGHUPPID

10、killall指令

该指令用于向一个指令发动的进程发送一个信号,它的一般语法如下:

killall[-iIe][commandname]

它的参数如下:

-i:交互式的意思,若需求删去时,会问询用户

-e:表明后边接的commandname要一致,但commandname不能超过15个字符

-I:指令称号疏忽大小写

#例如:

killall-SIGHUPsyslogd#重新发动syslogd

11、file指令

该指令用于判断接在file指令后的文件的根本数据,由于在Linux下文件的类型并不是以后缀为分的,所以这个指令对咱们来说就很有用了,它的用法十分简略,根本语法如下:

filefilename

#例如:

file./test

12、tar指令

该指令用于对文件进行打包,默认状况并不会紧缩,假如指定了相应的参数,它还会调用相应的紧缩程序(如gzip和bzip等)进行紧缩和解压。它的常用参数如下:

-c:新建打包文件

-t:检查打包文件的内容含有哪些文件名

-x:解打包或解紧缩的功能,能够调配-C(大写)指定解压的目录,留意-c,-t,-x不能一同出现在同一条指令中

-j:经过bzip2的支持进行紧缩/解紧缩

-z:经过gzip的支持进行紧缩/解紧缩

-v:在紧缩/解紧缩过程中,将正在处理的文件名显示出来

-ffilename:filename为要处理的文件

-Cdir:指定紧缩/解紧缩的目录dir

上面的阐明能够现已让你晕过去了,但是一般咱们只需求记住下面三条指令即可:

紧缩:tar-jcv-ffilename.tar.bz2要被处理的文件或目录称号

查询:tar-jtv-ffilename.tar.bz2

解压:tar-jxv-ffilename.tar.bz2-C欲解紧缩的目录

注:文件名并不定要以后缀tar.bz2结尾,这儿首要是为了阐明运用的紧缩程序为bzip2

13、cat指令

该指令用于检查文本文件的内容,后接要检查的文件名,一般可用管道与more和less一同运用,然后能够一页页地检查数据。例如:

cattext|less#检查text文件中的内容

#注:这条指令也能够运用lesstext来替代

14、chgrp指令

该指令用于改动文件所属用户组,它的运用十分简略,它的根本用法如下:

chgrp[-R]dirname/filename

-R:进行递归的持续对一切文件和子目录更改

#例如:

chgrpusers-R./dir#递归地把dir目录下中的一切文件和子目录下一切文件的用户组修改为users

15、chown指令

该指令用于改动文件的一切者,与chgrp指令的运用方法相同,只是修改的文件特点不同,不再胪陈。

16、chmod指令

该指令用于改动文件的权限,一般的用法如下:

chmod[-R]xyz文件或目录

-R:进行递归的持续更改,即连同子目录下的一切文件都会更改

一同,chmod还能够运用u(user)、g(group)、o(other)、a(all)和+(参加)、-(删去)、=(设置)跟rwx调配来对文件的权限进行更改。

#例如:

chmod0755file#把file的文件权限改动为-rxwr-xr-x

chmodg+wfile#向file的文件权限中参加用户组可写权限

18、vim指令

该指令首要用于文本编辑,它接一个或多个文件名作为参数,假如文件存在就打开,假如文件不存在就以该文件名创建一个文件。vim是一个十分好用的文本编辑器,它里面有许多十分好用的指令,在这儿不再多说。你能够从这儿下载vim常用操作的详细阐明。

19、gcc指令

对于一个用Linux开发C程序的人来说,这个指令就十分重要了,它用于把C言语的源程序文件,编译成可履行程序,由于g++的许多参数跟它十分类似,所以这儿只介绍gcc的参数,它的常用参数如下:

-o:output之意,用于指定生成一个可履行文件的文件名

-c:用于把源文件生成方针文件(.o),并阻挠编译器创建一个完好的程序

-I:增加编译时查找头文件的途径

-L:增加编译时查找静态连接库的途径

-S:把源文件生成汇编代码文件

-lm:表明规范库的目录中名为libm.a的函数库

-lpthread:连接NPTL实现的线程库

-std=:用于指定把运用的C言语的版本

#例如:

#把源文件test.c依照c99规范编译成可履行程序test

gcc-otesttest.c-lm-std=c99

#把源文件test.c转换为相应的汇编程序源文件test.s

gcc-Stest.c

20、time指令

该指令用于测算一个指令(即程序)的履行时刻。它的运用十分简略,就像平时输入指令相同,不过在指令的前面参加一个time即可,例如:

time./process

timepsaux

在程序或指令运转完毕后,在最终输出了三个时刻,它们分别是:

user:用户CPU时刻,指令履行完结花费的用户CPU时刻,即指令在用户态中履行时刻总和;

system:体系CPU时刻,指令履行完结花费的体系CPU时刻,即指令在核心态中履行时刻总和;

real:实践时刻,从command指令行开始履行到运转停止的消逝时刻;

注:用户CPU时刻和体系CPU时刻之和为CPU时刻,即指令占用CPU履行的时刻总和。实践时刻要大于CPU时刻,由于Linux是多使命操作体系,往往在履行一条指令时,体系还要处理其它使命。另一个需求留意的问题是即便每次履行相同指令,但所花费的时刻也是不相同,其花费时刻是与体系运转相关的。
图片[1]-linux常用的20个命令(详细语法实例)-小白之家,linux详细语法实例,Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码。比如在ARMLinux内,一个.dts(devicetreesource)文件对应一个ARM的machine,一般放置在内核的”arch/arm/boot/dts/”目录内,比如exynos4412参考板的板级设备树文件就是”arch/arm/boot/dts/exynos4412-origen.dts”。这个文件可以通过$makedtbs命令编译成二进制的.dtb文件供内核驱动使用。

基于同样的软件分层设计的思想,由于一个SoC可能对应多个machine,如果每个machine的设备树都写成一个完全独立的.dts文件,那么势必相当一些.dts文件有重复的部分,为了解决这个问题,Linux设备树目录把一个SoC公用的部分或者多个machine共同的部分提炼为相应的.dtsi文件。这样每个.dts就只有自己差异的部分,公有的部分只需要”include”相应的.dtsi文件,这样就是整个设备树的管理更加有序。我这里用`Linux4.8.5源码自带的dm9000网卡为例来分析设备树的使用和移植。这个网卡的设备树节点信息在”Documentation/devicetree/bindings/net/davicom-dm9000.txt”有详细说明,其网卡驱动源码是”drivers/net/ethernet/davicom/dm9000.c”。

设备树框架

设备树用树状结构描述设备信息,它有以下几种特性

每个设备树文件都有一个根节点,每个设备都是一个节点。

节点间可以嵌套,形成父子关系,这样就可以方便的描述设备间的关系。

每个设备的属性都用一组key-value对(键值对)来描述。

每个属性的描述用;结束

所以,一个设备树的基本框架可以写成下面这个样子,一般来说,/表示板子,它的子节点node1表示SoC上的某个控制器,控制器中的子节点node2表示挂接在这个控制器上的设备(们)。

/{//根节点

node1{//node1是节点名,是/的子节点

key=value;//node1的属性



node2{//node2是node1的子节点

key=value;//node2的属性



}

}//node1的描述到此为止

node3{

key=value;



}

}

节点名

理论个节点名只要是长度不超过31个字符的ASCII字符串即可,此外

Linux内核还约定设备名应写成形如<name>[@<unit_address>]的形式,其中name就是设备名,最长可以是31个字符长度。unit_address一般是设备地址,用来唯一标识一个节点,下面就是典型节点名的写法

上面的节点名是firmware,节点路径是/firmware@0203f000,这点要注意,因为根据节点名查找节点的API的参数是不能有”@xxx”这部分的。

Linux中的设备树还包括几个特殊的节点,比如chosen,chosen节点不描述一个真实设备,而是用于firmware传递一些数据给OS,比如bootloader传递内核启动参数给内核

引用

当我们找一个节点的时候,我们必须书写完整的节点路径,这样当一个节点嵌套比较深的时候就不是很方便,所以,设备树允许我们用下面的形式为节点标注引用(起别名),借以省去冗长的路径。这样就可以实现类似函数调用的效果。编译设备树的时候,相同的节点的不同属性信息都会被合并,相同节点的相同的属性会被重写,使用引用可以避免移植者四处找节点,直接在板级.dts增改即可。

下面的例子中就是直接引用了dtsi中的一个节点,并向其中添加/修改新的属性信息

KEY

在设备树中,键值对是描述属性的方式,比如,Linux驱动中可以通过设备节点中的”compatible”这个属性查找设备节点。

Linux设备树语法中定义了一些具有规范意义的属性,包括:compatible,address,interrupt等,这些信息能够在内核初始化找到节点的时候,自动解析生成相应的设备信息。此外,还有一些Linux内核定义好的,一类设备通用的有默认意义的属性,这些属性一般不能被内核自动解析生成相应的设备信息,但是内核已经编写的相应的解析提取函数,常见的有”mac_addr”,”gpio”,”clock”,”power”。”regulator”等等。

compatible

设备节点中对应的节点信息已经被内核构造成structplatform_device。驱动可以通过相应的函数从中提取信息。compatible属性是用来查找节点的方法之一,另外还可以通过节点名或节点路径查找指定节点。dm9000驱动中就是使用下面这个函数通过设备节点中的”compatible”属性提取相应的信息,所以二者的字符串需要严格匹配。

在下面的这个dm9000的例子中,我们在相应的板级dts中找到了这样的代码块:

然后我们取内核源码中找到dm9000的网卡驱动,从中可以发现这个驱动是使用的设备树描述的设备信息(这不废话么,显然用设备树好处多多)。我们可以找到它用来描述设备信息的结构体,可以看出,驱动中用于匹配的结构使用的compatible和设备树中一模一样,否则就可能无法匹配,这里另外的一点是structof_device_id数组的最后一个成员一定是空,因为相关的操作API会读取这个数组直到遇到一个空。

address

(几乎)所有的设备都需要与CPU的IO口相连,所以其IO端口信息就需要在设备节点节点中说明。常用的属性有

#address-cells,用来描述子节点”reg”属性的地址表中用来描述首地址的cell的数量,

#size-cells,用来描述子节点”reg”属性的地址表中用来描述地址长度的cell的数量。

有了这两个属性,子节点中的”reg”就可以描述一块连续的地址区域。下例中,父节点中指定了#address-cells=<2>;#size-cells=<1>,则子节点dev-bootscs0中的reg中的前两个数表示一个地址,即MBUS_ID(0xf0,0x01)和0x1045C,最后一个数的表示地址跨度,即是0x4

interrupts

一个计算机系统中大量设备都是通过中断请求CPU服务的,所以设备节点中就需要在指定中断号。常用的属性有

interrupt-controller一个空属性用来声明这个node接收中断信号,即这个node是一个中断控制器。

#interrupt-cells,是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符,用来描述子节点中”interrupts”属性使用了父节点中的interrupts属性的具体的哪个值。一般,如果父节点的该属性的值是3,则子节点的interrupts一个cell的三个32bits整数值分别为:<中断域中断触发方式>,如果父节点的该属性是2,则是<中断触发方式>

interrupt-parent,标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的

interrupts,一个中断标识符列表,表示每一个中断输出信号

设备树中中断的部分涉及的部分比较多,interrupt-controller表示这个节点是一个中断控制器,需要注意的是,一个SoC中可能有不止一个中断控制器,这就会涉及到设备树中断组织的很多概念,下面是在文件”arch/arm/boot/dts/exynos4.dtsi”中对exynos4412的中断控制器(GIC)节点描述:

要说interrupt-parent,就得首先讲讲Linux设备管理中对中断的设计思路演变。随着linuxkernel的发展,在内核中将interruptcontroller抽象成irqchip这个概念越来越流行,甚至GPIOcontroller也可以被看出一个interruptcontrollerchip,这样,系统中至少有两个中断控制器了,另外,在硬件上,随着系统复杂度加大,外设中断数据增加,实际上系统可以需要多个中断控制器进行级联,形成事实上的硬件中断处理结构:

在这种趋势下,内核中原本的中断源直接到中断号的方式已经很难继续发展了,为了解决这些问题,linuxkernel的大牛们就创造了irqdomain(中断域)这个概念。domain在内核中有很多,除了irqdomain,还有powerdomain,clockdomain等等,所谓domain,就是领域,范围的意思,也就是说,任何的定义出了这个范围就没有意义了。如上所述,系统中所有的interruptcontroller会形成树状结构,对于每个interruptcontroller都可以连接若干个外设的中断请求(interruptsource,中断源),interruptcontroller会对连接其上的interruptsource(根据其在Interruptcontroller中物理特性)进行编号(也就是HWinterruptID了)。有了irqdomain这个概念之后,这个编号仅仅限制在本interruptcontroller范围内,有了这样的设计,CPU(Linux内核)就可以根据级联的规则一级一级的找到想要访问的中断。当然,通常我们关心的只是内核中的中断号,具体这个中断号是怎么找到相应的中断源的,我们作为程序员往往不需要关心,除了在写设备树的时候,设备树就是要描述嵌入式软件开发中涉及的所有硬件信息,所以,设备树就需要准确的描述硬件上处理中断的这种树状结构,如此,就有了我们的interrupt-parant这样的概念:用来连接这样的树状结构的上下级,用于表示这个中断归属于哪个interruptcontroller,比如,一个接在GPIO上的按键,它的组织形式就是:

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论