Yunduan CUI
graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible
Part 1 学习Shell
1. 什么是 Shell?
Shell 是用户与操作系统交流的程序,它读取用户的键盘输入并交由操作系统执行相应的命令。所有linux都支持一个叫做 bash 的shell,它的全称是 “Bourne Again SHell”,bash 的前身是由 Steve Bourne 写的sh。
当我们使用Shell的时候,我们实际上需要另一个叫做 terminal emulator 的程序与shell进行交互,也就是我们常见的一个叫做终端的程序。(终端可以选择不同的Shell)
2. 巡航
巡航linux的文件系统,常用命令为:
- ls:显示当前工作目录的文件
- cd: 更改工作目录
- pwd:显示当前工作目录名称
linux使用一个基于树德文件系统。不同于windows把每一个磁盘都看做是独立的文件系统,linux 总是保持一个文件系统。
在使用cd命令时,cd 直接返回默认目录,cd ~user_name 返回对应用户的默认目录,cd - 返回之前的目录。另外 . 表示当前目录,..表示父目录
使用ls命令时默认是不显示隐藏文件的,要显示它们 使用 ls -a
3. 探索文件
使用ls的更多技巧,ls支持显示指定文件夹内容,也支持显示两个文件夹的内容。使用 ls -l 可以显示文件的长格式。-t 可以按照更改时间对文件进行排序。其他比较有用的选项:
* -F 特别标注/在文件夹名后 -r 反向用字母表显示 -S 以文件大小排序 -t 以更改时间排序
关于文件的长格式
其中第一列 是文件访问权限 第一个字母:- 代表常规文件 d 代表文件夹 l 代表连接文件 接下来三个字母是对文件拥有者的权限 再接下来三个字母是对同组成员的权限,最后三个是对所有人的权限 r代表读 w代表写 x代表执行 第二列表示文件个数(对于文件夹,文件的话自然是1) 第三列表示拥有者 第四列表示属于的组 第五列表示文件大小(bytes) 第六列是创建日期 第七列是文件名
确定文件类型
使用 file 命令确定文件类型
读取文件内容
使用 less 命令读取文件内容, 进入内容后的操作如下:
Page Up/b 前滚一页
Page Down/空格 后滚一页
上/下箭头 前滚/后滚一行
G 移动到文件尾
1G/g 移动到文件头
/【characters】 前向查找【characters】
n 找到下一个查找目标
h 显示帮助
q 退出
less 的前身叫做 more,之所以取这个看起来相反的名字是因为 Less is more
介绍文件系统
目录名 | 介绍 |
---|---|
/ | 根目录 |
/bin | Contains binaries 存放系统的程序 |
/boot | 有关启动的信息,初始化的 RAM与硬盘镜像,以及linux内核 |
/dev | 存放驱动程序 |
/etc | 存放系统,程序的配置文件,和shell script |
/home | 给用户使用的文件夹,一般用户只需要在这个文件件内工作 |
/lib | 所有程序使用的库文件(有点像windows的DLL文件)都在这里 |
/lost+found | 被格式化的linux文件系统才会有这个文件夹,可以用来部分的恢复文件。除非发生了糟糕的事情,它一般是空的 |
/mnt | 只出现在老的linux上,用来存放可移动设备的驱动 |
/opt | 可选的程序都放在这里,这里一般存放用户后来安装的程序 |
/proc | 这是一个特殊的文件夹。它是一个虚拟文件夹,相当于一个通向linux内核的窥视孔,你可以从里面的文件看到内核是如何看当前这一台PC的 |
/root | root 账号的目录 |
/sbin | 超级用户使用,内含核心系统程序 |
/tmp | 临时文件存放处 |
/usr | 一般来说都是最大的一个文件夹,含有所有常规用户使用的程序和文件 |
/usr/bin | 存放安装的linux可执行文件 |
/usr/lib | 用户安装文件使用的库文件 |
/usr/local | 用户安装的程序,一般从源码编译的文件都装在这里 |
/usr/sbin | 存放安装的管理员程序 |
/usr/share | 存放/usr/share中程序共享的文件 |
/usr/share/doc | 一般安装的一些包都含有文档,就放在啊这里 |
/var | 也是用来存放经常被更改的文件,例如用户邮件 |
/var/log | 存放日志文件 |
Symbolic Links
Linux中独特的一种文件形式,可以连接到其他文件。也叫做软式连接 soft link,他可以方便我们更新某些组件的版本,因为link可以当做是变量名一样。
4. 操作文件与目录
本节我们将介绍命令:
- cp:拷贝文件/目录
- mv: 移动 or 重命名 文件/目录
- mkdir:创建目录
- rm:删除文件/目录
- ln:创建link
通配符 (wildcards)
星号* 对应所有的符号(含复数个)
?对应所有的单个符号
[character]对应任意一个属于括号内集合的符号
[!character]对应任意一个不属于括号内集合的符号
[[:class:]]对应任意一个属于该类型的符号,类型为:
[:alnum:] 对应所有字母数字
[:alpha:] 对应所有字母
[:digit:] 对应所有数字
[:lower:] 对应所有小写字符
[:upper:] 对应所有大写字符
一些通配符的例子:
* 所有文件
g* 所有以字母 g 开头的文件
b*.txt 所有以字母 b 开头且结尾是 .txt 的文件
Data??? 所有以 Data 开头,后面接着三个符号的文件
[abc]* 所有以 a 或者 b 或者 c 开头的文件
BACKUP.[0-9][0-9][0-9] 所有已 BACKUP. 开头后接三个数字的文件
[[:upper:]]* 所有以大写字母开头的文件
[![:digit:]]* 所有以非数字开头的文件
*[[:lower:]123] 所有以小写字母或者 1 或者 2 或者 3 结尾的文件
mkdir 创建目录
我们可以单独创建一个目录 或者连续创建多个目录:
mkdir dir1
mkdir dir1 dir2 dir3
cp 拷贝文件
将文件/目录 1 拷贝至 文件/目录2:
cp item1 item2
拷贝复数个文件/目录到一个目录:
cp item... directory
cp命令的选项有:
-d 复制相同的符号连接
-p 复制相同的文件属性
-R 递归复制目录下的所有文件
-a 等于-dpR
-i 交互式拷贝,在需要覆盖原有文件之前询问用户
-u 只复制目标目录中没有的文件
-v 详细显示操作的消息
mv 移动或者重命名文件
-i 交互式拷贝,在需要覆盖原有文件之前询问用户
-u 只复制目标目录中没有的文件
-v 详细显示操作的消息
rm 删除文件
-i 交互式删除,在动作之前询问
-f 无提示不检查暴力删除
-v 显示详细操作信息
rm 的使用是比较危险的,注意空格会造成截然不同的结果:
rm *.html 将会删除所有目录下的 html 格式文件,然而如果我们错误的使用了一个空格
rm * .html 将会删除全部目录下的文件并提示找不到文件 .html
ln 创造链接
ln file link
注意软硬链接的不同,一般我们使用软链接就好.
5. 使用命令工作
命令的种类可以分为:
- 可执行程序
- shell 自建的命令
- shell 方程
- 一个其他命令的代称
显示命令的种类 type
type command
显示可执行命令的位置 which
which command
获取命令的帮助 help
help command
这是一个非常重要的命令,可以用来学习大量的命令
有一些命令支持使用
command --help
来获取帮助信息。
获取可执行命令的手册 man
man 命令可以获得命令的完全手册, 很多手册都非常凶残且难以阅读 比如 bash 的。
man program
apropos 命令获得一个粗略的模糊的潜在搜索名单
apropos command
简化版的手册 whatis
使用 whatis 可以获得简短的帮助文件
whatis program
>ls(1) - list directory contents
另一个可选的手册 info
用法和 man 一样。
使用 alias 制作自己的命令
语法:
alias name='string'
这里举一个例子,我们要进入 /usr 目录,运行 ls 然后在返回之前的目录,即:
naist-wavenet125-052:~ YunduanCUI$ cd /usr;ls;cd -
X11 bin libexec sbin standalone
adic lib local share
/Users/YunduanCUI
naist-wavenet125-052:~ YunduanCUI$
我们使用一个没有被占用的名称 foo 来建立这个联合命令:
alias foo='cd /usr; ls; cd -'
naist-wavenet125-052:~ YunduanCUI$ foo
X11 bin libexec sbin standalone
adic lib local share
/Users/YunduanCUI
naist-wavenet125-052:~ YunduanCUI$
此时我们检查 foo 的类型就会发现:
naist-wavenet125-052:~ YunduanCUI$ type foo
foo is aliased to `cd /usr; ls; cd -'
抹去这个自定义的命令,使用:
unalias name
6. 重定向 Redirection
本节我们学习输入输出的重定向 I/O Redirection, 学习的命令包括:
cat 连接文件
sort 排列
uniq 报告或删除重复行
grep 打印符合要求的行
wc 向文件中输入
head 输出文件首的部分
tail 输出文件尾的部分
tee 标准输入输出
命令的交互包括输入输出和错误信息。因为UNIX中所有的物件都是文件,所以实际打印在屏幕上的也是标准的输出,只是这些没有被保存为磁盘上的文件。
标准输出重定向
标准输出重定向的符号是 >
naist-wavenet125-052:~ YunduanCUI$ ls -l > ~/ls-output.txt
之后就生成了相应的文件,注意这里就不在有屏幕显示了。将生成的文件作为标准输入的话,我们可以使用 ls 命令来直接查看它的文件状态:
naist-wavenet125-052:~ YunduanCUI$ ls -l ls-output.txt
如果要查看,我们使用 less 命令:
naist-wavenet125-052:~ YunduanCUI$ less ls-output.txt
标准错误重定向
使用运算符 2>
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr 2> ls-error.txt
如果同时需要重新定向标准输出和错误输出的话,可以使用
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr > ls-output.txt 2>&1
即输出的错误重定向到当先的标准输出位置(已经被重新定向过了),这样的话,没有错误就输出标准输出,有错误就输出标准错误输出。
当前的bash提供另一个方式来重定向输出和错误:
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr &> ls-output.txt
清除不想要的输出
当你不想看到输出的错误信息时,可以重定向它们到比特桶里:
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr 2> /dev/null
重定向标准输入
使用cat连接文件
cat实质上会把第一个参数的文件直接输出,在你没有指定第二个目标文件的参数时,它选择将第一个参数文件的内容打印到屏幕上。如果不给参数的话,cat进入输入模式,无论输入什么,它都直接将输入打印到屏幕。
naist-wavenet125-052:~ YunduanCUI$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.
实现了将输入内容重定向到指定文件。
管道
管道 | 可以直接将第一个命令的输出传递到第二个命令的输入。
naist-wavenet125-052:~ YunduanCUI$ ls -l /usr/bin | less
要注意与重定向的不同,重定向连接的是命令与文件而管道连接的是命令的输出和另一个命令的输入。
过滤器
使用sort来进行预先排序
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | less
使用uniq来消除重复行
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq | less
使用 uniq -d 来查看重复内容
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq -d | less
使用 wc 来计算行数字数比特数
naist-wavenet125-052:~ YunduanCUI$ wc ls-output.txt
1 7 40 ls-output.txt
输出表示有一行七个字符共40比特,使用 wc -l 可以只计算行数
grep 寻找指定行
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
funzip
gunzip
gzip
unzip
unzipsfx
zip
zipcloak
zipdetails
zipdetails5.16
zipdetails5.18
zipgrep
zipinfo
zipnote
zipsplit
寻找带 zip 的行。
使用 head 和 tail 命令来选择开头或结尾的内容
head -n 5
tail -n 5
指定行数选择内容。
tail -f
动态显示当前更新的行尾。
使用 shell
本章我们着重讲一个命令 echo,它的作用是输出一行文档。
naist-wavenet125-052:~ YunduanCUI$ echo this is a test
this is a test
shell 完全支持正则表达式,使用 *,我们得到:
naist-wavenet125-052:~ YunduanCUI$ echo *
Applications Desktop Documents Downloads Dropbox Google 云端硬盘 Library LinuxScript Movies Music Pictures Public Python Python_space TEXex Ten Thumbs Students VirtualBox VMs email feedparser-5.1.3 lazy_dog.txt ls-error.txt ls-output.txt nusers python.vim ros_catkin_ws src subl testDigits trainingDigits unixstuff vim vimtext vimtext2 wordpress 百度云同步盘
可以灵活的使用,像:
naist-wavenet125-052:~ YunduanCUI$ echo D*
Desktop Documents Downloads Dropbox
naist-wavenet125-052:~ YunduanCUI$ echo *s
Applications Documents Downloads Movies Pictures Ten Thumbs Students VirtualBox VMs nusers ros_catkin_ws testDigits trainingDigits wordpress
naist-wavenet125-052:~ YunduanCUI$ echo [[:upper:]]*
Applications Desktop Documents Downloads Dropbox Google 云端硬盘 Library LinuxScript Movies Music Pictures Public Python Python_space TEXex Ten Thumbs Students VirtualBox VMs
naist-wavenet125-052:~ YunduanCUI$ echo /usr/*/share
/usr/X11/share /usr/local/share
波浪号的使用
~ 表示当前用户的 home 目录
naist-wavenet125-052:~ YunduanCUI$ echo ~
/Users/YunduanCUI
算数扩张
naist-wavenet125-052:~ YunduanCUI$ echo $((2+2))
4
使用时要注意数学表达式的专用形式 $((expression)), 支持加减乘除取模和乘方(**)运算。
中括号扩张
中括号扩张让格式化重复字符变得可能:
naist-wavenet125-052:~ YunduanCUI$ echo Front-{A,B,C}-back
Front-A-back Front-B-back Front-C-back
注意{}内部和之间不可以有空格。使用 ... 可以更加方便的计数:
naist-wavenet125-052:~ YunduanCUI$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
naist-wavenet125-052:~ YunduanCUI$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
联合起来使用:
naist-wavenet125-052:~ YunduanCUI$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
naist-wavenet125-052:~ YunduanCUI$ mkdir Photos
naist-wavenet125-052:~ YunduanCUI$ cd Photos/
naist-wavenet125-052:Photos YunduanCUI$ ls
naist-wavenet125-052:Photos YunduanCUI$ mkdir {2012..2016}-{01..12}
naist-wavenet125-052:Photos YunduanCUI$ ls
2012-1 2012-8 2013-6 2014-4 2015-2 2016-11
2012-10 2012-9 2013-7 2014-5 2015-3 2016-12
2012-11 2013-1 2013-8 2014-6 2015-4 2016-2
2012-12 2013-10 2013-9 2014-7 2015-5 2016-3
2012-2 2013-11 2014-1 2014-8 2015-6 2016-4
2012-3 2013-12 2014-10 2014-9 2015-7 2016-5
2012-4 2013-2 2014-11 2015-1 2015-8 2016-6
2012-5 2013-3 2014-12 2015-10 2015-9 2016-7
2012-6 2013-4 2014-2 2015-11 2016-1 2016-8
2012-7 2013-5 2014-3 2015-12 2016-10 2016-9
参数扩张
echo 也可以用来显示参数名,使用$即可:
naist-wavenet125-052:~ YunduanCUI$ echo $USER
YunduanCUI
显示了自己的名称,如果参数不存在,则什么也不显示。
与命令行的联动
Linux Command Line 笔记(1)的更多相关文章
-
《The Linux Command Line》 读书笔记02 关于命令的命令
<The Linux Command Line> 读书笔记02 关于命令的命令 命令的四种类型 type type—Indicate how a command name is inter ...
-
《The Linux Command Line》 读书笔记01 基本命令介绍
<The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...
-
《The Linux Command Line》 读书笔记04 Linux用户以及权限相关命令
Linux用户以及权限相关命令 查看身份 id:Display user identity. 这个命令的输出会显示uid,gid和用户所属的组. uid即user ID,这是账户创建时被赋予的. gi ...
-
[笔记]The Linux command line
Notes on The Linux Command Line (by W. E. Shotts Jr.) edited by Gopher 感觉博客园是不是搞了什么CSS在里头--在博客园显示效果挺 ...
-
Linux Command Line Basics
Most of this note comes from the Beginning the Linux Command Line, Second Edition by Sander van Vugt ...
-
Linux Command Line 解析
Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...
-
15 Examples To Master Linux Command Line History
When you are using Linux command line frequently, using the history effectively can be a major produ ...
-
10 Interesting Linux Command Line Tricks and Tips Worth Knowing
I passionately enjoy working with commands as they offer more control over a Linux system than GUIs( ...
-
Reso | The Linux Command Line 的中文版
http://book.haoduoshipin.com/tlcl/book/zh/ 本书是 The Linux Command Line 的中文版, 为大家提供了多种不同的阅读方式. 中英文双语版- ...
随机推荐
-
[C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
-
Spring 和SpringMVC 的父子容器关系
Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配 ...
-
awesome awesomeness
Awesome Awesomeness A curated list of amazingly awesome awesomeness.Also available on: Awesome-Aweso ...
-
QT:QBitArray
QbitArray类提供位操作序列. include<QBitArray> 公有函数: QBitArray () QBitArray ( int size , bool valu ...
-
【转】Cocos2d-x 2.x CCSprite 灰白图的生成(利用shader设置)&mdash;&mdash;2013-08-27 21
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=325 游戏中人物死掉后要把人物头 ...
-
【转】AngularJs $location获取url参数
// 带#号的url,看?号的url,见下面 url = http://qiaole.sinaapp.com?#name=cccccc $location.absUrl(); // http://qi ...
-
Shell脚本笔记
如何查询文件里的某个字符串? grep “字符串” 文件 例:grep "abc" tmp.txt 如何将查询出来的内容赋给变量? str=$(grep "abc ...
-
C#中数组、ArrayList和List三者的区别 转
在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...
-
[mybatis错误] - sql出错 org.apache.ibatis.ognl.ParseException: Encountered ";!"; at line 1, column 15. Was expecting one of:
完整异常:Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'developerTy ...
-
git 创建空提交
git commit --allow-empty -m "Empty Commit to setup deployments"