Shell
shell就是命令解释器,就是当你登录上Unix/Linux后,出现了$提示符,那就是shell进程了。shell是一个程序,它是Unix中最巧妙最强大的功能之一。
Unix/Linux的命令格式
Unix/Linux的标准命令格式为:CMD(命令名) [OPTION(选项)] [ARGS(参数)]
其中OPTION(选项)有两种格式:一个横线"-“是简写选项,而两个横线”–"是要写出整个选项单词。
以ls命令为例,为了显示隐藏文件,即文件名以"."开头的文件,可以有两种写法,这两种写法是等价的。
ls -a
ls --all
仍以ls命令为例,
ls /tmp
可以显示 /tmp 目录下的文件列表。这里的 /tmp即为ARG(参数)。
ls -a \tmp
就可以显示/tmp目录下包括隐藏文件的所有文件的列表。
我们也可以将多个OPTION合并,即
ls -a -l /tmp
一般简写为
ls -al /tmp
OPTION和ARGS对于大多数命令都是可选的,即可以不写。
基本文件操作命令
print working directory(打印当前工作目录)
pwd
cd [dir]
change current directory to dir(改变当前目录到dir)。如果没有给出dir参数,会改变当前目录到该用户的主目录
cd /tmp
pwd
cd
pwd
ls [dir]
list directory contents(列出目录的内容),如果没有给出dir参数,会列出当前工作目录的内容。
[OPTION]
-a #do not ignore entries starting with .
-l #use a long listing format
-R #list subdirectories recursively
mkdir
make directories(创建目录)
[OPTION]
-p #no error if existing, make parent directories as needed
cp
copy files and directories (复制目录和文件)
注意:当我们希望复制“不为空”的目录时,必须要使用-R选项,意思为recursive(递归的)。即当目录下有文件时,要拷贝;当目录下还有子目录时,要递归地拷贝子目录和其中的文件和目录,以此类推。
[OPTION]
-R #copy directories recursively
mv SOURCE DEST
move (rename) files (移动或重命名文件)
该命令本质为对目录中存储的文件名进行改名。
mv haha.h hello.h
rm
remove files or directories (删除文件或目录)
注意:当删除目录时,必须使用-R选项——递归地删除一个目录和其子目录(如果有的话)。
[OPTION]
-R #remove directories and their contents recursively
-f #ignore nonexistent files and arguments, never prompt(某些版本会在我们删除非空的目录时不停地要我们确认是否删除,可以使用-f选项忽略)
cat
显示文本文件内容。cat原意是concatenate,是将多个文件连接在一起并在标准输出(终端)上输出(或重定向到文件),即用来连接多个文件用的。但大部分时候都用来在终端上显示一个文本文件。但当文件过大超过一屏幕时,我们只能看见最后一屏的文件内容。
cat /usr/include/stdio.h
more
当文件大于一屏时,我们可以用more命令进行分屏查看。此时,我们可以用按enter键查看下一行,按空格键查看下一屏,按q键退出。下例为more /usr/include/stdio.h的运行效果。
more除了用于分页显示文本文件,也可以用于通过管道对其他命令的结果进行分屏,例如:
ls -l /etc/ | more
man
man命令是系统手册页。
用法为:
man page
page为要查看的手册页项目,例如
man ls
可以查看ls命令的详细用法。
man手册共分为9个部分,分别是:
- Executable programs or shell commands
- System calls (functions provided by the kernel)
- Library calls (functions within program libraries)
- Special files (usually found in /dev)
- File formats and conventions eg /etc/passwd
- Games
- Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
- System administration commands (usually only for root)
- Kernel routines [Non standard]
注意3p这个章节,3代表手册第三部分,即库函数,p代表POSIX,即Unix操作系统标准。除了Unix和Linux,比如OS X(macOS)也是完全支持POSIX的。
如果手册项目在不同章节重名的话,会返回按章节号数字从小到大排列找到的第一个项目。例如,
man read
会返回man手册1中的read命令,而如果你想查看的是系统调用read,那必须使用
man 2 read
其中数字2表示在手册第2部分(系统调用)查看。
see also
下图为man 2 read的see also
内容。这里罗列了所有与read系统调用相关,也就是几乎全部的与文件相关的系统调用。这对于我们学习相关的系统命令、系统调用、系统函数非常有用。
man -k keyword
等同于命令apropos. 用于在man手册页中查询关键字为keyword的手册项目。
管道
Unix系统的本领在于它能让多个程序一起工作来产生需要的信息。在Unix系统中,绝大多数程序是一种软件工具:软件工具一般从标准输入中读数据,在标准输出上输出结果。他们可以和其他程序组合起来产生更强有力的工具——管道就可以实现这一功能。
管道是UNIX系统最古老的IPC(进程间通信)形式。作为Unix的一个特色,管道操作符可以在命令行上组装出专门的程序。管道按次序把命令连接起来,可以将前一个命令的输出作为后一个命令的输入。例如上一节的例子,当我们发现ls -l /etc
的结果不能在一个屏幕上显示了,这时你就可以用more处理ls的输出,进行分屏。
ls -l /etc/ | more
数一数/usr/include/
下有多少个后缀为.h
的文件
ls /usr/include/|grep "\."h$|wc -l
I/O重定向
在Unix系统中,绝大多数程序是一种软件工具:软件工具一般从标准输入中读数据,在标准输出上输出结果。如果我们将标准输入(或标准输出)连接至某个文件上,这样我们就可以实现从文件中读(或把结果写到某个文件里),我们称之为标准输入重定向(或标准输出重定向)。
标准输出重定向
ls /usr/include
此时ls的输出结果在终端显示。如果我们使用标准输出重定向,我们发现在终端上没有显示任何内容。标准输出重定向的符号是“>”。
ls /usr/include>ls.txt
这时我们发现当前工作目录下增加了一个新文件ls.txt,ls命令的输出结果被重定向到ls.txt文件了,ls的输出结果在文件里。
标准输入重定向
sort命令会从标准输入(默认是终端)读入字符串,然后为它们排序。当你输入完全部字符串后,输入Ctrl+d代表“end of file”。此时sort会把排序号的结果输出。
我们可以让sort从某文件里读入字符串,再进行排序。此时是标准输入重定向。标准输入重定向的符号是“<”。如:
sort</usr/include/stdio.h
输出结果按行排序了。
Vim
Vim即Vi IMproved,是Vi编辑器的升级版。Vi是Bill Joy开发的Unix文本编辑器,几乎在任何Unix服务器上都会配备。Vi仅用键盘操作,保证手指一直处于盲打姿势。其功能强大,效率极高,但学习曲线极其陡峭,是初学者的噩梦。
Vi有三种工作模式,分别是命令模式、编辑模式(或称为insert模式)和“最后一行”模式(或称为执行模式)。
这三种模式的转化关系为:
使用命令vi运行vi编辑器(对于Linux,一般vi命令是vim的别名,即实际上运行的是vim)。
vi hello.c
在命令模式下,输入的任何字符都是命令。因此,初学者会发现他无法在编辑器中输入文本。如果我们用网络游戏作为类别的话,命令模式下,w、a、s、d这四个键会控制角色向上、左、下、右方向移动,而不会输入w、a、s、d这四个字符。如果希望打字给别的玩家,则需要输入命令:enter键。此时w、a、s、d这四个键才会输入字符。vi也是相似的。需要输入命令,比如i键——代表insert。当按下i键后,vi进入到insert模式.
对于vim而言,一般我们可以看到左下角会显示“–insert–”字样。但传统vi不会显示“–insert–”,这种情况下我们只需通过是否可以键入文本来判断是否为insert模式。接着编辑一个hello world的C程序。
此时按Esc
键,又会回到命令模式。
在命令模式下调整光标位置使用的是h、j、k、l,而不建议使用上下左右键,因为:
- 对于Unix服务器上的纯vi编辑器,不支持上下左右键
- 使用上下左右键破坏了盲打的手型,降低效率。
Vim常用命令(命令模式下)
光标移动
h
(left), j (down), k
(up), l
(right)
^f
(page down) ^b
(page up)
^
(first char.) $
(last char.)
G
(bottom page)
gg or :1
(goto first line)
切换到insert模式
a
(append) i
(insert) o
(insert line after) O
(insert line before)
复制
yy
(yank: copy a line) y3y (从当前位置复制3行)
粘贴
p
(paste after: 把刚才复制的内容粘贴至当前光标后) P
(paste before)
删除
dd
(delete a line) d10d
(delete 10 lines)
d$
(delete till end of line) dG
(delete till end of file)
x
(current char)
合并两行
J
(注意是大写的J,这个在传统的Vi上尤其有用。初学者在使用传统Vi经常遇到的尴尬事:无法把刚才一不小心回车产生的两行变回原来的一行,此时J命令能拯救你。)
Undo and Redo
u
(Undo) Ctrl+r
(Redo)
搜索文档内容
/
(此时左下角出现了一个/,将搜索内容写在/后面即可,回车)
此时,可以用n查找下一个匹配的字符串,用N查找上一个匹配的字符串。
最后一行模式
在命令模式下,输入:
,进入最后一行模式,可见最后一行出现了一个冒号。
将想要执行的命令写在冒号后面,敲击回车即可。
存盘/退出(最后一行模式)
:w
(write)
:q
(quit)
:wq
(write and quit)
:q!
(give up changes)
vimtutor
vimtutor是一个循序渐进,非常完善的vim使用教程,也可以作为vim中等水平用户的使用手册。在终端输入
vimtutor
即可使用。
C语言程序的编译和运行
C语言程序的编译
使用cc命令编译C语言源程序。
如果提示
-bash: cc: command not found
说明此时gcc没有下载,需要执行以下命令下载
yum install gcc
等待下载完成即可使用。编译成功后,可以看见生成了一个名为a.out的可执行程序。当然我们也可以用-o
选项指定生成程序的名字。
cc hello.c -o hello
在Unix系统中,可执行程序通常没有后缀名。cc命令其实是gcc命令的一个符号链接,也可以直接使用gcc命令来编译C语言程序。
自编程序的运行
使用./
程序名来运行一个程序。通常,“./
”是必须的。".
"的含义是“当前目录”的意思。我们会在文件系统那个章节详细讲解文件系统原理,在shell编程部分讲解环境变量PATH,到时候我们就能清楚为何需要这个“./
”了。
说明此时gcc没有下载,需要执行以下命令下载
```shell
yum install gcc
等待下载完成即可使用。编译成功后,可以看见生成了一个名为a.out的可执行程序。当然我们也可以用-o
选项指定生成程序的名字。
cc hello.c -o hello
在Unix系统中,可执行程序通常没有后缀名。cc命令其实是gcc命令的一个符号链接,也可以直接使用gcc命令来编译C语言程序。
自编程序的运行
使用./
程序名来运行一个程序。通常,“./
”是必须的。".
"的含义是“当前目录”的意思。我们会在文件系统那个章节详细讲解文件系统原理,在shell编程部分讲解环境变量PATH,到时候我们就能清楚为何需要这个“./
”了。
[外链图片转存中…(img-hsWYU3uW-1638596221492)]