九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
转载自:
九十分钟极速入门Linux——Linux Guide for Developments 学习笔记
http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=404510068&idx=2&sn=0fc406025644a60ae8a94f3ff0cba626&scene=23&srcid=0101ZDCyZGjWLS8ygofWkNSh#rd
一张图了解命令提示符和命令行
一些实用小命令
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 dir2move: $ 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|uniq|grep str|sort(uniq忽略重复行,grep打印匹配行,sort对每行字符串进行排序)
用户和文件权限
在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,依次执行命令:
1
2
3
4
5
|
$ 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
命令就是语句,语句就是命令
因为每一个命令都是合法的脚本语句,因此可以把多条语句直接罗列到脚本中,也可以将其包裹到一个函数中:
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/env bash
say_hello()
{
echo "hello"
}
create_file()
{
touch a.txt
}
say_hello # 通过呼叫函数名来执行
create_file
|
此外,还有些元素是脚本语句的一部分:
1
2
3
4
|
if [ $ # != 1 ]
then
echo "hello"
fi
|
注意到,这里的[ $# != 1 ]
其实也可以放到终端中去执行
1
2
3
|
$[ $ # != 1 ]
$ echo $?
0
|
查看返回指为0 表示命令执行成功。只要if 后面跟一个可以正确执行的命令,则结果为真;如果跟一个执行会出错的命令,那么结果即为假。此外,由于命令对空格是敏感的,这就导致脚本语句对空格也是变态的敏感。
位置参数
执行下面的脚本: $ ./xpjiang.sh a.txt b.txt(执行前需要$ chmod +x xpjiang.sh):
1
2
3
4
5
6
|
#!/usr/bin/env bash
echo "
Number of arguments: $ #
The program name is: $0
The first argument is: $1
"
|
输出如下:
1
2
3
|
Number of arguments: 2
The program name is: . /xpjiang .sh
The first argument is: a.txt
|
这里的$0 代表命令名,$1 代表第一个参数,$2 代表第二个参数...,$# 表示该命令执行时的参数总个数。
脚本不再当前shell 中执行
每次启动一个脚本,系统都会为当前shell 单独开启一个子shell,在子shell 中执行脚本中的语句。例如,脚本中导出一个环境变量:
1
2
3
4
|
#!/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,更改模式为可执行:
1
2
3
4
5
6
|
cd $1
echo I am in ` pwd ` # `pwd` 会取出该命令的输出
for file in ` ls `
do
mv $ file $ file .txt
done
|
添加到 ~/bin 中,使其成为一个系统命令。执行:
1
2
3
4
5
|
$ 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 远程登录服务器的时候,需要先登录再执行命令,实际中每次这样操作很麻烦。可以在本地写一个脚本,在服务器上执行脚本中相关的命令。
确认执行
让程序在执行过程中暂停,报告一些信息,用户根据程序提供的信息判断是否允许程序继续执行下面的操作,这就是确认执行。
1
2
3
4
5
6
7
8
9
|
#!/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.
九十分钟极速入门Linux——Linux Guide for Developments 学习笔记相关推荐
- PyTorch 深度学习: 60 分钟极速入门
PyTorch 深度学习: 60 分钟极速入门 2019年年初,ApacheCN组织志愿者翻译了PyTorch1.2版本中文文档(github地址),同时也获得了PyTorch官方授权,我相信已经有许 ...
- 60 分钟极速入门 PyTorch
2017 年初,Facebook 在机器学习和科学计算工具 Torch 的基础上,针对 Python 语言发布了一个全新的机器学习工具包 PyTorch. 因其在灵活性.易用性.速度方面的优秀表现,经 ...
- Linux内核设计与实现学习笔记目录
**注:**这是别人的笔记,我只是把目录抄过来 <Linux内核设计与实现学习笔记> 1.<Linux内核设计与实现>读书笔记(一)-内核简介 2.<Linux内核设计与 ...
- 《Linux高性能服务器编程》学习笔记
<Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...
- 鸟叔linux私房菜基础篇简体,鸟叔的Linux私房菜基础篇-学习笔记(一)
鸟叔的Linux私房菜基础篇-学习笔记(一) 开机进入命令行模式: ctrl+alt+[F1-F6]的任意键进入命令行编辑界面 ctrl+alt+F7进入图形界面模式 开始下达指令 [dmtsai@s ...
- Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程) 一.TCP服务器(一请求一线程) 的原理 二.完整代码 三.测试 四.补充 一.TCP服务器(一请求一线 ...
- 《鸟哥的Linux私房菜》个人学习笔记-第一篇
<鸟哥的Linux私房菜>个人学习笔记-基础篇 这是一篇一个linux菜鸡自学的笔记 csdn上的各位大手子们好,本人实习生一枚最近想自己深入学习下linux,所以在社区里发博客,希望能记 ...
- Class4 Linux云上环境搭建学习笔记
Class4 Linux云上环境搭建学习笔记 Linux的远程管理 为Linux环境安装图形化桌面(Gnome) 学习Linux的基本操作 更新一个官方教程 附阿里云高校学习计划的地址 class4 ...
- Vue学习(入门实例、常用指令)-学习笔记
文章目录 Vue学习(入门实例.常用指令)-学习笔记 实例 常用指令 v-on v-bind v-for v-html v-if event v-model 双向数据绑定实现 - defineProp ...
最新文章
- Python里面None True False之间的区别
- PathComposePathEffectView 使用
- 详解Android Handler的使用
- 十月 android版本分布,安兔兔发布2018年10月份Android手机性能排行榜
- nginx 配置expires
- 河北大学计算机在哪学,河北大学计算机科学与技术学院
- 牛客题霸 [ 环形链表的约瑟夫问题] C++题解/答案
- python函数里面可以修改一些数据类型
- 神州数码最佳实践之一:向项目管理要效益
- Linux学习笔记 -- 实用指令
- 瑞友天翼苹果手机(iPhone)客户端安装及使用
- 官方AI语音系统电销机器人系统搭建|AI智能|电话机器人源码|2022最新电销外呼系统《各版本机器人部署》
- dsoframer java_[转]内嵌WORD/OFFICE的WINFORM程序——DSOFRAMER使用小结
- E文积累_20080321_drink to the dregs
- android运行微信小程序,【报Bug】微信小程序在Android真机运行时报错atob is not a function...
- linux命令行连接蓝牙音箱,有些Linux发行版用蓝牙连接天猫精灵和小爱音箱没声音...
- 【网络实验】10G网络下的真实带宽——CPU负载与网卡TSO、GSO
- Tomcat修改默认主页
- 使用一个git仓库管理多个项目
- phinx武林秘籍(上)
热门文章
- api网关揭秘--spring cloud gateway源码解析
- HBase在阿里搜索中的应用实践
- spring security源码分析心得
- 1到1亿的自然数,求所有数的拆分后的数字之和
- Active Object 并发模式在 Java 中的应用--转载
- EasyMock 使用方法与原理剖析--转载
- Making the impossible: 3 nodes intercontinental replication--转载
- “三通一达”创始人均来自桐庐 有的村人均GDP上亿
- 用Java编写第一个区块链(二)
- eBay数据科学家李睿:自然语言处理在eBay的技术实践 数据 网络 类别 技术 分类器 阅读1593 近日,在飞马网主办的“FMI人工智能大数据高峰论坛”上,来自eBay的数据科学家李睿