graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible
Shell 是用户与操作系统交流的程序,它读取用户的键盘输入并交由操作系统执行相应的命令。所有linux都支持一个叫做 bash 的shell,它的全称是 “Bourne Again SHell”,bash 的前身是由 Steve Bourne 写的sh。
当我们使用Shell的时候,我们实际上需要另一个叫做 terminal emulator 的程序与shell进行交互,也就是我们常见的一个叫做终端的程序。(终端可以选择不同的Shell)
巡航linux的文件系统,常用命令为:
linux使用一个基于树德文件系统。不同于windows把每一个磁盘都看做是独立的文件系统,linux 总是保持一个文件系统。
在使用cd命令时,cd 直接返回默认目录,cd ~user_name 返回对应用户的默认目录,cd - 返回之前的目录。另外 . 表示当前目录,..表示父目录
使用ls命令时默认是不显示隐藏文件的,要显示它们 使用 ls -a
使用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 | 存放日志文件 |
Linux中独特的一种文件形式,可以连接到其他文件。也叫做软式连接 soft link,他可以方便我们更新某些组件的版本,因为link可以当做是变量名一样。
本节我们将介绍命令:
星号* 对应所有的符号(含复数个)
?对应所有的单个符号
[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 dir1
mkdir dir1 dir2 dir3
将文件/目录 1 拷贝至 文件/目录2:
cp item1 item2
拷贝复数个文件/目录到一个目录:
cp item... directory
cp命令的选项有:
-d 复制相同的符号连接
-p 复制相同的文件属性
-R 递归复制目录下的所有文件
-a 等于-dpR
-i 交互式拷贝,在需要覆盖原有文件之前询问用户
-u 只复制目标目录中没有的文件
-v 详细显示操作的消息
-i 交互式拷贝,在需要覆盖原有文件之前询问用户
-u 只复制目标目录中没有的文件
-v 详细显示操作的消息
-i 交互式删除,在动作之前询问
-f 无提示不检查暴力删除
-v 显示详细操作信息
rm 的使用是比较危险的,注意空格会造成截然不同的结果:
rm *.html 将会删除所有目录下的 html 格式文件,然而如果我们错误的使用了一个空格
rm * .html 将会删除全部目录下的文件并提示找不到文件 .html
ln file link
注意软硬链接的不同,一般我们使用软链接就好.
命令的种类可以分为:
type command
which command
help command
这是一个非常重要的命令,可以用来学习大量的命令
有一些命令支持使用
command --help
来获取帮助信息。
man 命令可以获得命令的完全手册, 很多手册都非常凶残且难以阅读 比如 bash 的。
man program
apropos 命令获得一个粗略的模糊的潜在搜索名单
apropos command
使用 whatis 可以获得简短的帮助文件
whatis program
>ls(1) - list directory contents
用法和 man 一样。
语法:
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
本节我们学习输入输出的重定向 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进入输入模式,无论输入什么,它都直接将输入打印到屏幕。
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
要注意与重定向的不同,重定向连接的是命令与文件而管道连接的是命令的输出和另一个命令的输入。
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | less
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
naist-wavenet125-052:~ YunduanCUI$ wc ls-output.txt
1 7 40 ls-output.txt
输出表示有一行七个字符共40比特,使用 wc -l 可以只计算行数
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 -n 5
tail -n 5
指定行数选择内容。
tail -f
动态显示当前更新的行尾。
本章我们着重讲一个命令 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
显示了自己的名称,如果参数不存在,则什么也不显示。
与命令行的联动