九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
2015-12-30 18:34 星星之火✨🔥 阅读(2052) 评论(3) 编辑 收藏 举报系统信息:CentOS 64位。
-
一张图了解命令提示符和命令行
-
一些实用小命令
mkdir(make directory,创建目录)、ls(list,列出当前目录下的内容)、rm(remove,删除文件,如果删除目录,需要加参数-r,表示递归-recursive删除)、man(manual,手册,后面跟命令打开该命令的使用手册,进入后键入/- 参数:查找参数如何使用,n查找下一处,q退出用户手册)、ctrl+l(清屏)、pwd(print working dir,显示工作路径)、ctrl+a:到达命名行首
更多信息可参见书籍:The Linux Command Line的第二章和第六章(什么是shell、使用命令)
-
在文件系统中跳转
cd(change directory)、.表示当前目录、./代表当前目录的子目录、..表示当前目录的父目录、cd /(通过绝对路径的方式进入根目录)、cd -(回到原来的目录)
Tips:cd 目录名(和cd ./目录名的作用相同) 可以通过Tab键补齐,如果有多个备选项的话,双击Tab列出所有匹配选项
更多参见书籍:The Linux Command Line的第三章(文件系统中跳转)
-
操作文件和目录
copy: $ cp file1 file2 $cp -r dir1 dir2
move: $ mv file dir/
rename: $ mv file1 file2 $mv dir1 dir2 # 如果dir2 存在,则为移动操作
remove: $ rm file $rm -r dir
创建文件: $ touch a.txt $ >a.txt 查看文件: $ cat file
创建目录: $mkdir dir 查看文件类型: $file a.txt
创建隐藏文件/目录:touch .文件名 或 mkdir .mydir,通过ls -a可以看到。
利用通配符删除当前目录下的所有文件:rm -rf * 字符串匹配,列出/bin目录下的所有包含"pin"字符串的文件: ls /bin|grep pin
下载imooc主页:wget http://imooc.com
分页查看文件内容:less 文件名 (按住j向下滚屏 按住k向上滚屏 /字符:进行字符查找,键入n查找下一处 双击g可以到达文件头 点击G可到达文件尾 q退出),man命令底层的分页就是用的less,因此less中所有的快捷键在man中都是可以使用的。
放大/缩小/还原终端字体:ctrl + + ctrl + - ctrl + 0
输入命令后不想执行:ctrl+ c
解压缩zip文件:unzip 文件名 压缩成zip文件:zip -r 压缩后文件名.zip 被压缩的文件名
解压缩*.tar.gz文件:tar zxvf 文件名 压缩成tar文件:tar zcvf 压缩后文件名.tar.gz 被压缩文件名
解压缩*.tar.bz2文件:tar jxvf 文件名 压缩成tar文件:tar jcvf 压缩后文件名.tar.gz 被压缩文件名
-
重定向
输出重定向(redirect stdout):>
将程序的输出内容保存到文件中:date >output.txt(注:date是一个系统自带程序,输出当前时间)
cat file1 >file 表示将file1的内容复制到file中 cat file1 >>file 表示将file1的内容追加到file中 cat file1 file2 >file 表示将file1和file2连接到file中
标准错误重定向(redirect stderr):2>
标准输入重定向(redirect stdin):<
(PS:linux下有一个传统:Everything is a file,如目录是一个目录文件,各种设备都被抽象成了文件放到了目录文件/dev下,系统上有三个非常特殊的文件,因为它们是一直打开的,因此系统为他们分配了三个固定的file descriptor,文件描述符为0的文件叫做标准输入文件(stdin),为1的叫做标准输出文件(stdout),为2的叫做标准错误输出文件(stderr),因此你会看到标准错误输出重定向的标识符为:2>)
一般情况下,标准输入重定向的使用频率不如管道,如:cat file1|sort|uniq|grep str(sort对每行字符串进行排序,uniq忽略重复行,grep打印匹配行。PS:uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。换句话说,为了使uniq起作用,所有的重复行必须是相邻的。)
-
用户和文件权限
在Linux中有这么一项传统:home is writable but not outside.
三种权限:用户对文件主要有三种权限:r(reading)、w(writing)、x(executing)。
三种用户类型:owner、group、world
对权限的讨论就是看owner、group、world对文件的r/w/x权限。
如在终端中查看文件权限:$ ls - l a.txt,得到结果(注:查看目录权限,ls -ld mydir):
-rw-rw-rw-. 1 xpjiang xpjiang 6 12月 23 21:31 a.txt
该行信息传达的信息如下图:
对文件的r 权限表示可以查看文件的内容(cat file),对目录的r 权限表示可以查看目录的内容(ls mydir);对文件的w 权限表示可以编辑该文件里的内容,而对目录的w 权限表示我们可以在该目录下创建、删除、重命名文件;对文件的x 权限表示可以把它作为一个程序来执行,对目录的x 权限表示我们可以进入该目录(cd mydir)。
对当前目录增加写权限:chmod +w .
用vim编辑器创建一个脚本文件a.sh:vim a.sh(键入i进入插入模式,写入一个简单的打印命令:echo hello,esc退出插入模式,两次大写Z保存文件),执行该脚本:./a.sh,一般情况下,我们没有执行权限,可以这样做:chmod +x a.sh,执行该脚本,终端输出:hello。
chmod(change file mode):chmod 666 a.txt(666为file mode的八进制表示)
-
进程
获取进程号(PID,Process ID)
终端中启动vim,它会占据当前的shell,敲Ctrl+Shift+T(编辑->键盘快捷键中可查看终端中使用的快捷键,也可根据需要自定义快捷键,例如Ctrl+Shift+C复制内容,Ctrl+Shift+V粘贴)打开一个新的终端标签,ps aux 查看系统上所有的进程情况,因为输出篇幅较长,我们可以在ps aux 后面加上管道符(|),用less 程序做分页器:ps aux|less,输出中的PID字段,就是我们关注的进程号。键入 /vim 进行查找,可以看到vim程序的进程号,不过更一般的查看进程号的方式是用grep 命令查找vim关键字:ps aux|grep vim,使用kill vim进程号 就可以结束vim程序(Ctrl+PgUp,切换到上一个终端标签可以看到vim程序已经被杀死了)。
后台执行
在命令行中也可以启动图形化程序,如firefox,Alt+Tab 可以切换回命令行,可以看到firefox占据了当前的shell,如何处理这种情况呢?一个简单的方法是firefox &,这样firefox就自动在后台执行了,而且切换回终端后命令行依然可以使用。但是如果已经出现了firefox占据了shell这种情况,可以Ctrl+z,发现firefox已经没有响应了,切回终端,键入bg,这样就跟firefox & 的情况一样了,fg切换回前台,Ctrl+c 结束firefox(bg:把一个任务放到后台执行,fg:把一个任务放到前台执行)。
kill
kill 命令中常用的信号有2、9、15。其中2 表示中断,实现和Ctrl+c 一样的功能,由终端发送,通常它会终止一个程序;15 表示终止,是kill 命令发送的默认信号,如果程序仍然"活着",可以接受信号的话;9 表示杀死,这个信号很特别,鉴于进程可能会选择不同的方式,来处理发送给它的信号,其中也包括忽略信号,这样9号信号并不发送给目标进程,而是内核立即终止这个进程。当一个进程以这种方式终止的时候,它没用机会去做些"清理"工作,或者是保存劳动成果。因为这个原因,可以把9号信号看作杀手锏(kill -9 进程号),当其他终止信号失败后,再使用它。
除了通过kill终止进程,很多程序也定义了自己的退出方式,比如shell就可以通过exit 命令退出,它等价于Ctrl+d。
这里顺便说一下一种更糟糕的情况,一个异常的程序占用了大量的内存,导致整个桌面系统卡顿了,使得我们无法在终端中输入命令,此时怎么办呢?Linux是同时运行着七个工作台的敲入Ctrl+Alt+F2到达其中一个工作台,在这里杀死那个进程,Ctrl+Alt+F1回到原来运行着图形化界面的工作台。
-
查找
文件和字符串搜索是一个开发者日常工作中颇为重要得一部分,下面就来看看shell中都有哪些命令供我们使用来实现自己的需求:
locate - 通过名字来在系统全局范围内查找文件
例:locate vimrc,locate命令还支持正则表达式:locate --regexp vim[a-z]rc
使用过程中,有时会发现一个奇怪的现象,如首先touch aa.txt,然后locate aa.txt,发现终端中没有输出,通过man locate 了解到locate reads one or more databases prepared by updatedb,换句话说,locate 不是直接搜索整个文件系统,而是从一个数据库中读数据,这也就是为什么locate 跑的如此溜的原因,系统中的命令updatedb 会把系统中的数据存放到数据库之中,但是updatedb 一般都是每天自动运行一次,因此我们刚刚创建的文件locate 是找不到的,解决办法就是手动运行一下:sudo updatedb。
find - 在目录层次结构中搜索文件,支持很多参数,经常与字符串查找利器grep一起使用,用来处理搜索到的文件列表。
例:find . 列出当前目录下的所有目录和文件,包括子目录的文件和目录。
find .|grep .txt,只列出名字包含.txt 目录和文件
find . -type f,只列出文件。
find . -type f -exec ls -l '{}' ';',-exec 的结束符是 ';' ,两者之间可以输入任意的系统命令。'{}'代表我们前面找到的文件名。
echo hello >a.txt echo Hello >b.txt find . -type f -exec grep -n hell0 '{}' ';' -print,-print 打印出匹配项(包含字符串"hello")所在的文件,-n 打印出匹配项所在的行号,如果想要忽略大小写可以在grep 后跟参数 -i,或者直接 -ni。
-
网络操作
网络操作主要涉及两块内容:远程操作工具ssh和数据传输工具rsync。由于没有可供操作的网络主机,因此这部分内容暂且略过。更多信息可参见书籍:The Linux Command Line第十七章(网络系统)。
-
软件安装
在CentOS上安装软件主要有三种方式:
- 手动下载编译好的软件或者源码进行安装
- 下载rpm 包安装(类似于ubuntu系统安装deb包)
- 从官方仓库,用yum 下载安装(类似于从ubuntu官网,用apt-get下载安装)
手动下载编译好的软件(可执行程序)安装实例:
从网址 http://sublimetext.com/,下载sublimeText编辑器。使用 tar jxvf Sublime\ Text\ 2.0.2.tar.bz2 解压缩,但是执行程序必须要用全路径来执行压缩包中的sublime_text,如果想方便使用,把它变成一个系统命令,需要把整个解压缩包中的子文件移动到$ PATH 包含的一个目录中(使用命令echo $ PATH查看),或者也可以不移动,方法就是搞一个符号链接:$ ln -s Sublime\ Text\ 2.0.2/sublime_text ~/bin/subl,如此在终端中直接输入subl 即可开启sublimeText编辑器。
手动下载源码安装实例:
首先从网址 http://ftp.gnu.org/gnu/hello/,下载 hello-2.2.tar.bz2,依次执行命令:
$ tar jxvf hello-2.2.tar.bz2 $ cd hello-2.2 $ ./configure $ make $ sudo make install
终端中执行$ hello,输出:hello, world!。这里./configure 的作用就是检查当前环境是否满足安装该软件的依赖关系,make 是用来从Makefile中读取指令进行编译的,而make install 是用来从Makefile中读取指令,将软件安装到指定位置的。
安装rpm 包:rpm -i rpm包
使用yum 在线下载安装:以安装git 为例:执行命令$ sudo yum install git,git 软件的rpm 包就被下载到本地硬盘,同时yum 命令包裹了rpm 命令,因此直接把安装配置过程也给完成了,也就是一个 yum install git 命令,git 就可以直接使用了,如果想卸载git,只需执行 $ sudo yum remove git即可。
-
shell 脚本编程
把许多命令集中到一个文件中作为一个脚本来执行,就是所谓的shell 脚本编程。
关于shell 脚本编程我们划分成以下几个部分一一阐述:
指定解析器
可以通过bash、ruby 或python 这样的语言来写脚本,只要在脚本的首行指定用什么语法来进行解析即可(bash 的语法很机器化,很多细节也比较晦涩,因此可以用ruby 这种更加人性化的语言来写脚本)。如:
#!/usr/bin/env bash 或 #!/usr/bin/env ruby 或 #!/usr/bin/env python
命令就是语句,语句就是命令
因为每一个命令都是合法的脚本语句,因此可以把多条语句直接罗列到脚本中,也可以将其包裹到一个函数中:
#!/usr/bin/env bash say_hello() { echo "hello" } create_file() { touch a.txt } say_hello # 通过呼叫函数名来执行 create_file
此外,还有些元素是脚本语句的一部分:
if [ $# != 1 ] then echo "hello" fi
注意到,这里的[ $# != 1 ]
其实也可以放到终端中去执行
$[ $# != 1 ] $ echo $? 0
查看返回指为0 表示命令执行成功。只要if 后面跟一个可以正确执行的命令,则结果为真;如果跟一个执行会出错的命令,那么结果即为假。此外,由于命令对空格是敏感的,这就导致脚本语句对空格也是变态的敏感。
位置参数
执行下面的脚本: $ ./xpjiang.sh a.txt b.txt(执行前需要$ chmod +x xpjiang.sh):
#!/usr/bin/env bash echo " Number of arguments: $# The program name is: $0 The first argument is: $1 "
输出如下:
Number of arguments: 2 The program name is: ./xpjiang.sh The first argument is: a.txt
这里的$0 代表命令名,$1 代表第一个参数,$2 代表第二个参数...,$# 表示该命令执行时的参数总个数。
脚本不再当前shell 中执行
每次启动一个脚本,系统都会为当前shell 单独开启一个子shell,在子shell 中执行脚本中的语句。例如,脚本中导出一个环境变量:
#!/usr/bin/env bash export Direct="/home/xpjiang/mydir/" cd $Direct touch hello.txt
执行$ ./xpjiang.sh 会发现,当前shell 中echo $Direct 得到的输出为空并且当前shell 中的工作目录也没有改变,这就说明脚本不在当前shell 中执行。如果需要脚本在当前shell 中执行,则执行 $ source xpjiang.sh,可以发现目录切换到了mydir 下,同时echo $Direct 的输出为/home/xpjiang/mydir。
循环控制
编写脚本rename.sh,更改模式为可执行:
cd $1 echo I am in `pwd` # `pwd` 会取出该命令的输出 for file in `ls` do mv $file $file.txt done
添加到 ~/bin 中,使其成为一个系统命令。执行:
$ mkdir mydir $ cd mydir; touch a b c; cd .. $ rename.sh mydir I am in /home/xpjiang/Desktop/mydir $ ls mydir a.txt b.txt c.txt
远程控制
SSH 远程登录服务器的时候,需要先登录再执行命令,实际中每次这样操作很麻烦。可以在本地写一个脚本,在服务器上执行脚本中相关的命令。
确认执行
让程序在执行过程中暂停,报告一些信息,用户根据程序提供的信息判断是否允许程序继续执行下面的操作,这就是确认执行。
#!/usr/bin/env bash echo -n "Do you want to say hello? (y/n): " read AAA if [ "${AAA:-y}" = "y" ]; then echo hello else echo Nothing done, bye. fi
Reference: MOOC_Liunx Guide for Developments.
最后:
转载请注明出处.
以上.