linux命令学习笔记

时间:2022-12-04 15:33:45

1.   编辑命令行的快捷键

Ctrl+U     :删除当前整行

Ctrl+C     :终止当前正在执行的命令,并移动光标到下一行的开头

 

2.   显示正在运行的shell

 命令:echo $SHELL   

 示例:

heaad@ubuntu:~$ echo $SHELL

/bin/bash

  

3.   为shell命令创建别名

命令:alias 

 例如:

alias la='ls -A' 表示 la已经设置为’ls –A’的别名。

 

在shell中输入alias将显示所有的别名设置:

heaad@ubuntu:~$ alias

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'

 

另外:'ls -A’与’ls -a’的区别是'ls -a'显示所有目录与文件,而'ls -A'显示除“.”与“..”外的所有目录与文件。

 

4.   删除或复制非空目录

rmdir 命令只能删除空目录,而rm则可以删除非空目录。

rm -r 目录名       (可删除非空目录及该目录下所有文件,rm命令删除的东西都不会放入trash中,切记!)

cp -r 源目录名 目标目录名         (可复制非空目录)

 

5.   确定文件类型

命令:file 文件列表

例如:

heaad@ubuntu:/bin$ file /bin/bash

/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

这表明/bin/bash文件是32位ELF可执行文件,使用了动态链接方式编译,运行的目标平台是80386,文件中不包含debug信息(stripped)

6.   ">>"、">"与"<"

“>>”:追加操作符,例如命令“cat  file1  >>  file2”将file1的内容追加到file2后面

“>”:Linux输出重定向操作符,例如命令 “cat  file1  file2  file3  >  file4 ”将file1、file2、file3的内容合并到file4中(file4原来的内容将丢失)。

“<”:Linux输入重定向操作符,例如命令“more < file1 ”。

 

7.   diff与patch

diff命令:比较两个目录或两个文件的差异,一般用于生成源代码补丁

示例:

diff  -urBNw  dir1  dir2  > patch.diff

将目录dir1与目录dir2的差别记录于patch.diff 。

各个选项的意义:

-u   : 采用新版式上下文格式(使用“+”和“-”来表示有差别的地方,并显示前后相同的3行)

-r   :对目录进行递归处理

-B   :忽略对空行的比较

-N   :将不存在的文件当作空文件处理

-w   :忽略对空格的比较

 

 

patch命令:用于打补丁

示例:

使用下面命令把我们刚才生成的补丁文件patch.diff应用于dir1,从而使dir1与dir2的内容完全一样。

cd  dir1

patch  -p1  < ../patch.diff

 

8.   chown,chgrp,chmod命令

这3个命令都需要有管理员权限才能使用。

 

    (1)chown命令用于改变文件的所有者

 示例:

下面的命令将文件file1的所有者改为root:

 

heaad@ubuntu:~/a$ ls -l

total 0

-rw-r--r-- 1 heaad heaad 0 2010-05-10 20:26 file1 (file1所有者是用户heaad)

 

heaad@ubuntu:~/a$ sudo chown root file1

heaad@ubuntu:~/a$ ls -l

total 0

-rw-r--r-- 1 root heaad 0 2010-05-10 20:26 file1 (file1所有者被修改为root)

 

(2)chgrp命令用于修改文件所属用户组

Linux中文件所属用户组的用户对该文件拥有不同于普通用户的权限。

示例:

下面的命令把file1文件所属用户组改变为root:

 

heaad@ubuntu:~/a$ sudo chgrp root file1

heaad@ubuntu:~/a$ ls -l

total 0

-rw-r--r-- 1 root root 0 2010-05-10 20:26 file1 (文件所属用户组被改变为root)

 

(3)chmod命令用于改变文件访问权限

  示例:

 

heaad@ubuntu:~/a$ ls -l

total 0

-rw-r--r-- 1 root root 0 2010-05-10 20:26 file1

heaad@ubuntu:~/a$ sudo chmod a+w,u+x,o-r file1  (给所有用户(a)加上写权限,给文件所有者(u)加上执行权限,剥夺其他用户(o)的读权限)

 heaad@ubuntu:~/a$ ls -l

total 0

-rwxrw--w- 1 root root 0 2010-05-10 20:26 file1

 

   对于每个文件都有3种不同的用户级别:文件所有者(u)、所属用户组(g)、系统中其他用户(o)。

命令“sudo chmod a+w,u+x,o-r file1”表示给所有用户加上file1文件的写权限,给文件所有者加上执行权限,删除其他用户的读权限。chmod命令使用“+”来增加权限,用“-”删除权限,“=”来设置权限。

 

9.   ln命令

ln命令用于建立链接。

(1)使用带有-s选项的ln命令将建立软链接,而不带-s的ln命令建立的是硬链接。

         示例:

在当前目录建立软链接link_to_file1,使其链接到file1:

         heaad@ubuntu:~/a/d$ ln -s  ../file1  ./link_to_file1

 

 

建立硬链接hardlink_to_file2,使其链接到file2:

heaad@ubuntu:~/a/d$ ln  ../file2  ./hardlink_to_file2

 

 (2)再来看看我们建立的软链接与硬链接的不同之处:

heaad@ubuntu:~/a/d$ ls -l

total 4

-rwxrwxrwx 2 heaad heaad 20 2010-05-10 20:53 hardlink_to_file2  (硬链接的链接计数是2)

lrwxrwxrwx 1 heaad heaad  8 2010-05-10 20:52 link_to_file1 -> ../file1  (软链接的链接计数仍然是1)

 

 

再看看原文件file1的变化:

-rwxrwxrwx 1 root  root    17 2010-05-10 20:51 file1 (对文件file1建立软链接后,文件的链接计数仍然是1)

-rwxrwxrwx 2 heaad heaad   20 2010-05-10 20:53 file2  (对文件file2建立硬链接后,文件的链接计数变为2)

         可以看出:软链接并不增加链接计数,而硬链接增加链接计数。无论是软链接还是硬链接,都与原文件拥有相同的读写权限。

(3)删除原文件后硬链接与软链接的不同表现

 

删除原文件:

heaad@ubuntu:~/a$ rm file1

 

 看看软链接的变化:

heaad@ubuntu:~/a/d$ ls -l

total 4

-rwxrwxrwx 2 heaad heaad 20 2010-05-10 20:53 hardlink_to_file2

lrwxrwxrwx 1 heaad heaad  8 2010-05-10 21:01 link2_to_file1 -> ../file1  ( 软链接link2_to_file1的链接计数仍然是1)

 

由于原文件已经没有了,软链接就指向了一个无效的位置:

heaad@ubuntu:~/a/d$ cat link2_to_file1

cat: link2_to_file1: No such file or directory

 

删除原文件后软链接并不删除,但是不再指向有效的文件。从这个角度看,软链接跟Windows中的快捷方式很类似。

 

再来看看删除原文件后硬链接的变化:

删除原文件:

heaad@ubuntu:~/a$ rm file2

 

看看硬链接的变化:

heaad@ubuntu:~/a/d$ ls -l

total 4

-rwxrwxrwx 1 heaad heaad 20 2010-05-10 20:53 hardlink_to_file2 (硬链接文件的链接计数减少1)

lrwxrwxrwx 1 heaad heaad  8 2010-05-10 21:01 link2_to_file1 -> ../file1

 

删除原文件后硬链接并不删除,但是其链接计数减少了1。我认为可以从文件系统的角度解析:硬链接中保存了文件的inode号,每建立一个到原文件的硬链接就会将该文件的inode中的引用计数加1。Linux只有在某个文件的inode的引用计数值减少到0时才删除该文件。

 

关于SUID,SGID,sticky

 

了解这三个特殊访问位前先了解Linux文件访问特权位:

  

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

 

SUID

SGID

sticky

r

w

x

r

w

x

r

w

x

文件类型位

特殊访问位

拥有者特权位

同组特权位

其他用户特权位

 

 

10. SUID(set-user-ID)位

    SUID位的作用:若文件F设置SUID位为1,文件F的拥有者是用户A,而用户B拥有文件F的执行权限,则当用户B执行文件F时就以文件拥有者(用户A)的权限执行。

    SUID位的典型应用:修改Linux用户密码。Linux用户密码加密后存储在/etc/passwd文件中,用户使用passwd命令修改密码。而修改/etc/passwd文件需要root权限, 如下图:

 

heaad@ubuntu:~$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1672 2010-04-30 03:22 /etc/passwd

 

 

那么普通用户是如何修改自己的密码的呢?答案在/usr/bin/passwd文件中,如下图:

heaad@ubuntu:~$ ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 37140 2010-01-26 09:09 /usr/bin/passwd

 

passwd命令的所有者特权位中的x变成了s,表示passwd文件设定了SUID特权位。那么其他用户执行passwd命令时将获得passwd文件的所有者(root)的权限,于是就有权限修改/etc/passwd文件了。

 

设置SUID位:使用如下命令设置SUID位:

$ sudo chmod 4xxx file

$ sudo chmod u+s file

其中的4xxx中的4是因为SUID位在特殊访问位中的第三位。

执行完上面的两条命令中的其中一条后,file文件的权限可能变成了rwsr-xr-x

    若文件所有者也没有该文件的执行权限,则上面的两条命令可能使file的访问权限位变成了rwSr--r--,其中的S是大写的

 

11. SGID(set-group-ID)位

    作用:SGID与SUID类似,但它是使执行的线程拥有所在组的权限。

    设置方式:

$ sudo chmod 2xxx file

$ sudo chmod g+s file

    执行完以上其中一条命令后,文件file的访问权限可能会变成rwxr-sr-x 。

 

12. sticky位

    作用:若目录A设置了sticky位,则除了目录A的所有者和root用户外,其他用户均不能删除或重命名目录A下的文件。

    设置方法:

$ sudo chmod +t file

$ sudo chmod 1xxx file

执行完以上其中一条命令,文件的访问权限位可能被改变为rwxr-xr-若文件所有者也没有执行权限,则访问权限位可能会变成rw-r--r-T 。

 

13. 隐藏文件的方法

       Linux下隐藏的文件有如下3种:

(1)    文件名以“.”开头的系统文件

(2)    文件名以“~”结尾的备份文件

(3)    在同一目录下名为“.hidden”的文件中记录着文件名的文件

       这3种文件在图形界面中都是是隐藏的。但第(2)和第(3)种文件在shell中用“ls”命令就可以看到,而第(1)种文件必须使用“ls -a”命令才能看到。

       在图形界面下可以通过 “ctrl+H” 快捷键来隐藏或显示隐藏文件。

 

14. history命令

作用:显示最近执行的命令

shell环境变量HISTSIZE表示保存最近执行的多少条命令,HISTFILE用于设置保存的文件,而HISTFILESIZE则表示这个文件的行数限制。

使用set命令可以查看这3个环境变量

… …                                                                       

HISTFILE=/home/heaad/.bash_history

HISTFILESIZE=2000

HISTSIZE=1000

… …

注意:shell中执行的命令并不会马上写进HISTFILE文件中。应该是shell关闭时,或缓冲区写满的时候再写进文件。

 

15. top命令

       作用:Linux下的任务管理器,可以监视CPU,内存等的使用状况

 

16. 命令在后台执行

命令后面加上“&”符号,则该命令将在后台执行。

 

17 .Command1 && Command2

Command1执行成功才开始执行Command2,若Command1执行失败,则Command2不执行。

 

18. Command1 || Command2

Command1执行失败才开始执行Command2,Command1执行成功,则Command2不执行。

 

19. pstree

作用:显示Linux进程树

类似功能的还有“ps -e f ”命令。

 

20. 输入重定向和输出重定向

(1)输入重定向

语法:Command < input-file

将命令输入重定向到文件输入,而不是默认的不是键盘输入。

例如cat < input_file,将从文件input_file中读入数据而不是键盘。

另外,cat < input_file与cat input_file区别:

cat input_file :文件名input_file作为参数传给cat命令,并不影响cat的标准输入流。

cat < input_file :暂时断开cat命令标准输入与键盘间的连接,并将input_file关联到cat的标准输入。

 

(2)输出重定向

语法:Command > output-file

将输出重定向到文件,而不是输出到默认的屏幕。这与输入重定向类似,但影响的是输出流。

 

(3)输入重定向与输出重定向的合并

Command < input-file > output-file

Command > output-file < input-file

以上两种格式是等价的,都是将命令的输入重定向到input-file文件,输出重定向到output-file文件。

例如:cat < file1 > file2,cat的输入来自file1,输出到file2。实质上就是将file1复制一个副本file2。

 

(4)关于标准错误重定向

 

Linux自动为每个命令打开3个文件,标准输入流、标准输出流、标准出错流,文件描述符分别是0,1 ,2 。

 

请参考这段文字:

重定向 1>&2 2>&1

在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:

0: Standard Input (STDIN)

1: Standard Output (STDOUT)

2: Standard Error Output (STDERR)

在标准情况下, 这些FD分别跟如下设备关联:

stdin(0): keyboard  键盘输入,并返回在前端

stdout(1): monitor  正确返回值 输出到前端

stderr(2): monitor 错误返回值 输出到前端


举例说明吧:

当前目录只有一个文件 a.txt.

[root@redhat box]# ls

a.txt

[root@redhat box]# ls a.txt b.txt         

ls: b.txt: No such file or directory     由于没有b.txt这个文件, 于是返回错误值, 这就是所谓的2输出(错误出错)

a.txt     而这个就是所谓的1输出(标准输出)


再接着看:

[root@redhat box]# ls a.txt b.txt  1>file.out 2>file.err

执行后,没有任何返回值. 原因是, 返回值都重定向到相应的文件中了,而不再前端显示

[root@redhat box]# cat file.out

a.txt

[root@redhat box]# cat file.err

ls: b.txt: No such file or directory 

一般来说, "1>" 通常可以省略成 ">".

即可以把如上命令写成: ls a.txt b.txt  >file.out 2>file.err

 

有了这些认识才能理解 "1>&2" 和 "2>&1".

1>&2  正确返回值传递给2输出通道 &2表示2输出通道

如果此处错写成 1>2, 就表示把1输出重定向到文件2中.

2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道.

举个例子.

[root@redhat box]# ls a.txt b.txt 1>file.out 2>&1 (标准输出重定向到文件,然后标准出错重定向到跟标准输出同一通道)

[root@redhat box]# cat file.out

ls: b.txt: No such file or directory

a.txt

现在, 正确的输出和错误的输出都定向到了file.out这个文件中, 而不显示在前端.

补充下, 输出不只1和2, 还有其他的类型, 这两种只是最常用和最基本的.

 

21.批量删除文件 
初衷:移植Linux时用gedit编辑代码,编辑后会留下以“~”号结尾的临时文件。我用diff命令制作内核补丁会将这些临时文件包含进去。因此需要找个方法删除这些垃圾。
 
解决方法1:
  find -name *~
  然后将找到的一个个rm掉
  缺点是费时。
 
解决方法2:
  自己写个shell脚本。感觉有点小题大作了
 
解决方法3:
  find -name *~ | xargs rm

 


  参考资料:《Linux:The Textbook》 by Syed Mansoor Sarwar