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-t 。若文件所有者也没有执行权限,则访问权限位可能会变成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