1.基本命令和C语言开发环境

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的运行效果。

image-20211130144934879

more除了用于分页显示文本文件,也可以用于通过管道对其他命令的结果进行分屏,例如:

ls -l /etc/ | more

man

man命令是系统手册页。

用法为:

man page

page为要查看的手册页项目,例如

man ls

可以查看ls命令的详细用法。

man手册共分为9个部分,分别是:

  1. Executable programs or shell commands
  2. System calls (functions provided by the kernel)
  3. Library calls (functions within program libraries)
  4. Special files (usually found in /dev)
  5. File formats and conventions eg /etc/passwd
  6. Games
  7. Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
  8. System administration commands (usually only for root)
  9. 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系统调用相关,也就是几乎全部的与文件相关的系统调用。这对于我们学习相关的系统命令、系统调用、系统函数非常有用。

image-20211130150018374
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的输出结果在文件里。

image-20211130190055761
标准输入重定向

sort命令会从标准输入(默认是终端)读入字符串,然后为它们排序。当你输入完全部字符串后,输入Ctrl+d代表“end of file”。此时sort会把排序号的结果输出。

image-20211130190406960

我们可以让sort从某文件里读入字符串,再进行排序。此时是标准输入重定向。标准输入重定向的符号是“<”。如:

sort</usr/include/stdio.h

输出结果按行排序了。

Vim

Vim即Vi IMproved,是Vi编辑器的升级版。Vi是Bill Joy开发的Unix文本编辑器,几乎在任何Unix服务器上都会配备。Vi仅用键盘操作,保证手指一直处于盲打姿势。其功能强大,效率极高,但学习曲线极其陡峭,是初学者的噩梦。

Vi有三种工作模式,分别是命令模式、编辑模式(或称为insert模式)和“最后一行”模式(或称为执行模式)。

这三种模式的转化关系为:

image-20211130190826164

使用命令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,而不建议使用上下左右键,因为:

  1. 对于Unix服务器上的纯vi编辑器,不支持上下左右键
  2. 使用上下左右键破坏了盲打的手型,降低效率。
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

即可使用。

image-20211130192321808

C语言程序的编译和运行

C语言程序的编译

使用cc命令编译C语言源程序。

image-20211130192758945

如果提示

-bash: cc: command not found

说明此时gcc没有下载,需要执行以下命令下载

yum install gcc

等待下载完成即可使用。编译成功后,可以看见生成了一个名为a.out的可执行程序。当然我们也可以用-o选项指定生成程序的名字。

cc hello.c -o hello

在Unix系统中,可执行程序通常没有后缀名。cc命令其实是gcc命令的一个符号链接,也可以直接使用gcc命令来编译C语言程序。

自编程序的运行

使用./程序名来运行一个程序。通常,“./”是必须的。"."的含义是“当前目录”的意思。我们会在文件系统那个章节详细讲解文件系统原理,在shell编程部分讲解环境变量PATH,到时候我们就能清楚为何需要这个“./”了。

image-20211130193539603


说明此时gcc没有下载,需要执行以下命令下载

```shell
yum install gcc

等待下载完成即可使用。编译成功后,可以看见生成了一个名为a.out的可执行程序。当然我们也可以用-o选项指定生成程序的名字。

cc hello.c -o hello

在Unix系统中,可执行程序通常没有后缀名。cc命令其实是gcc命令的一个符号链接,也可以直接使用gcc命令来编译C语言程序。

自编程序的运行

使用./程序名来运行一个程序。通常,“./”是必须的。"."的含义是“当前目录”的意思。我们会在文件系统那个章节详细讲解文件系统原理,在shell编程部分讲解环境变量PATH,到时候我们就能清楚为何需要这个“./”了。

[外链图片转存中…(img-hsWYU3uW-1638596221492)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值