source
使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。(该命令通常用命令“.”来替代。)
使用范例:
source filename
. filename(中间有空格)
source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
当前脚本中配置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文档
例子:
假如在登录后对 .bash_profile 中的 EDITER 和 TERM 变量做了修改,则能够用source命令重新执行
.bash_profile 中的命令而不用注销并重新登录。比如您在一个脚本里export $KKK=111
,假如您用./a.sh执行该脚本,执行完毕后,您运行 echo $KKK,发现没有值,假如您用source来执行
,然后再echo,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是source不同他就是在本shell中执行的,所以能够看到结果。
source filename 与 sh filename 及./filename执行脚本的区别在那里呢?
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
再举例:
1.新建一个test.sh脚本,内容为:A=1
2.然后使其可执行chmod +x test.sh
3.运行sh test.sh后,echo $A,显示为空,因为A=1并未传回给当前shell
4.运行./test.sh后,也是一样的效果
5.运行source test.sh 或者 . test.sh,然后echo $A,则会显示1,说明A=1的变量在当前shell中
find 命令用来在指定目录下查找文件。
语法
·find path -option [ -print ] [ -exec -ok command ] {}
find (指定目录) (指定选项) [查找玩之后执行的动作 ]
任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
常用实例:
列出当前目录及子目录下所有文件和文件夹
find .
*表示通配任意个字符 ?表示通配单个字符
find /home -name "*.t?t"
查找文件更新日时在距现在时刻4天以内的文件
find /usr -mtime -4
查找文件更新日时在距现在时刻5天以上的文件
find /usr -mtime +4
查找文件更新日时在距现在时刻4天以上5天以内的文件
find /usr -mtime 4
查找系统中所有者为mhy的文件
find / -user mhy
- 这里我们可以引申 -a -o -not的用法:
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思 通过这三个我们可以自由组合各种筛选选项或者规则
查找名为txt后缀和所属为mhy的文件
find . -name "*.txt" -a -user mhy
列出所有的管道类型文件
find / -type p
列出/usr中大于10M的文件
find / -size +10M
列出/var目录下文件权限为777的文件
find /var -perm 777
压缩解压
grep 命令用于查找文件里符合条件的字符串
1.在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
grep test *file
2.查找前缀有“test”的文件包含“test”字符串的文件
$ grep test test*
3.如果文件名改为路径,需要加上-r参数:查找/etc/acp目录及其子目录下所有文件存在203字符的命令:
grep -r 203 /etc/acpi
4.通过"-v"参数可以打印出不符合条件行的内容。
grep -v test test.c
当然,如果将文件名改为目录,则命令改为:
grep -rv 203 /bin
5.通过-n参数可以显示符合样式的那一行之前,标示出该行的列数编号
grep -n 203 test.c
6.查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
7.同时匹配”abc”和”test”字符串
grep -e 'abc' -e 'dlf' test.txt
cat 用于连接文件并打印到标准输出设备上
语法格式
cat [-AbeEnstTuv] [--help] [--version] fileName
实例:
1.把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:
cat -n textfile1 > textfile2
2.把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:
cat -b textfile1 textfile2 >> textfile3
当然,也可以不加行号:
cat textfile1 textfile2 >> textfile3
3.清空 /etc/test.txt 文档内容:
cat /dev/null > /etc/test.txt
注意上例中有">>“与”>"的差别,读者一定要发现,>>是在后面添加,>是直接替换,实际情况可上机实践
4.创建一个文件,并以eof结束
cat >>文件名<<eof
比如:
cat >>1.txt <<eof
>1
>2
>3
>4
>5
>eof
就是创建1.txt这个文件里面内容是 1 2 3 4 5
patch打补丁
1.命令解释
1)diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。
语法格式:
diff 【选项】源文件(夹)目的文件(夹)
就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。
介绍三个最为常用选项:
-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。
2)patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。
介绍几个最常用选项:
-p0 选项要从当前目录查找目的文件(夹)
-p1 选项要忽略掉第一层目录,从当前目录开始查找。
举例说明:
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用参数-p0,那就表示从当前目录找个叫做old的文件夹,在它下面寻找modules下的pcitabl文件来执行patch操作。如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找module的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。
2.打包实例
1)单个文件打patch包
创建文件并写入数据:
hr@hr-virtual-machine:$ cat >>test0<<EOF
> 111111
> 111111
> 111111
> EOF
接着显示一下结果:
hr@hr-virtual-machine:$ more test0
111111
111111
111111
创建文件并写入数据:
hr@hr-virtual-machine:$ cat >>test1<<EOF
> 222222
> 111111
> 222222
> 111111
> EOF
接着显示一下结果:
hr@hr-virtual-machine:$ more test1
222222
111111
222222
111111
使用diff创建补丁test1.patch
hr@hr-virtual-machine:$ diff -uN test0 test1 > test1.patch
显示一下patch补丁:
hr@hr-virtual-machine:$ cat test1.patch
************************************************************
patch文件的结构头
补丁头是分别由
---/+++开头的两行,用来表示要打补丁的文件。
---开头表示旧文件,
+++开头表示新文件。
一个补丁文件中的多个补丁一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。
所以在一个补丁文件中可以包含好多个补丁。
块
块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。
他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。块的第一列+号表示这一行是要加上的。-号表示这一行是要删除的。没有加号也没有减号表示这里只是引用的而不需要修改。
************************************************************
diff命令会在补丁文件中记录这两个文件的首次创建时间,如下
--- test0 2006-08-18 09:12:01.000000000 +0800
+++ test1 2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
111111
-111111
+222222
111111
将补丁打到test0上(也就是将test0更新)
hr@hr-virtual-machine:$ patch -p0 < test1.patch
显示一下test0:
patch -RE -p0 < test1.patch cat test0
222222
111111
222222
111111
这样补丁就打完了,如果需要回退到之前,可以这样:
hr@hr-virtual-machine:$ patch -RE -p0 < test1.patch
2)为多个文件进行补丁操作
hr@hr-virtual-machine:$ mkdir prj0
hr@hr-virtual-machine:$ cp test0 prj0
hr@hr-virtual-machine:$ ls
test0
创建文件
hr@hr-virtual-machine:$ cat >>prj0name<<EOF
> --------
> prj0/prj0name
> --------
> EOF
创建文件
hr@hr-virtual-machine:$ ls
prj0name test0
hr@hr-virtual-machine:$ cd ..
hr@hr-virtual-machine:$ mkdir prj1
hr@hr-virtual-machine:$ cp test1 prj1
hr@hr-virtual-machine:$ cd prj1
hr@hr-virtual-machine:$ cat >>prj1name<<EOF
> ---------
> prj1/prj1name
> ---------
> EOF
创建patch包
hr@hr-virtual-machine:$ cd ..
hr@hr-virtual-machine:$ diff -uNr prj0 prj1 > prj1.patch
显示patch包
hr@hr-virtual-machine:$ more prj1.patch
diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name
2006-08-18 09:25:11.000000000 +0800 +++ prj1/prj0name 1970-01-01 08:00:00.000000000 +0800 @@ -1,3 +0,0 @@
---------
-prj0/prj0name
--------- diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name 1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name 2006-08-18 09:26:36.000000000 +0800
@@ -0,0 +1,3 @@
+---------
+prj1/prj1name
+---------
diff -uNr prj0/test0 prj1/test0
--- prj0/test0 2006-08-18 09:23:53.000000000 +0800
+++ prj1/test0 1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
--- prj0/test1 1970-01-01 08:00:00.000000000 +0800
+++ prj1/test1 2006-08-18 09:26:00.000000000 +0800
@@ -0,0 +1,4 @@
+222222
+111111
+222222
+111111
进入目录并打补丁
hr@hr-virtual-machine:$ cp prj1.patch ./prj0
hr@hr-virtual-machine:$ cd prj0
hr@hr-virtual-machine:$patch -p1 < prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
hr@hr-virtual-machine:$ ls
prj1name prj1.patch test1
回退到之前版本
hr@hr-virtual-machine:$ patch -R -p1 < prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
hr@hr-virtual-machine:$ ls
prj0name prj1.patch test0
总结几个关键的指令:
单个文件
diff –uN from-file to-file >to-file.patch
patch –p0 < to-file.patch
patch –RE –p0 < to-file.patch
多个文件
diff –
uNr from-docu to-docu >to-docu.patch
patch –p1 < to-docu.patch
patch –R –p1 <to-docu.patch
history 用于显示历史记录和执行过的指令命令
格式:
history(选项)(参数)
命令单独使用时,仅显示历史命令
选项
-N: 显示历史记录中最近的N个记录;
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中;
-d:删除历史记录中第offset个命令
-n:读取指定文件
参数
n:打印最近的n条历史命令。
[ljs@vm ~]$ history 5 #查看历史执行记录后 5 条
[ljs@vm ~]$ history #查看历史执行记录
[ljs@vm ~]$ !10 #执行历史记录第 10 条命令
[ljs@vm ~]$ !! #执行上一条命令
top命令 用于实时显示 process 的动态
语法
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
参数说明:
d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式,将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
n : 更新的次数,完成后将会退出 top
b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内
实例
显示进程信息
top
显示完整命令
top -c
以批处理模式显示程序信息
top -b
以累积模式显示程序信息
top -S
chmod命令 控制用户对文件的权限
只有文件所有者和超级用户可以修改文件或目录的权限。
格式:chmod [-cfvR] [--help] [--version] mode file...
只有文件所有者和超级用户可以修改文件或目录的权限。
例如, 765 将这样解释:
所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
最常用的格式:
chmod 777 file