UNIX / Linux Tutorial for Beginners (surrey.ac.uk)
一、Unix历史
1.1 什么是unix
UNIX 是 1960 年代首次开发的操作系统,此后一直在不断发展。操作系统是指使计算机工作的程序套件。它是一个稳定的、多用户、多任务系统,适用于服务器、台式机和笔记本电脑。
UNIX 系统还具有类似于 Microsoft Windows 的图形用户界面 (GUI),它提供了一个易于使用的环境。但是,对于图形程序未涵盖的操作,或者在没有可用的 Windows 界面时(例如,在 telnet 会话中),需要了解 UNIX。
1.2 unix不同版本
有许多不同版本的 UNIX,尽管它们有共同的相似之处。最流行的 UNIX 版本是 Sun Solaris、GNU/Linux 和 MacOS X。
在学校,我们在服务器和工作站上使用 Solaris,在服务器和台式 PC 上使用 Fedora Linux。
1.3 内核
UNIX 的内核是操作系统的中心:它为程序分配时间和内存,并处理文件存储和通信以响应系统调用。
为了说明 shell 和内核协同工作的方式,假设用户键入 rm myfile(它具有删除文件 myfile 的效果)。 shell 在文件存储中搜索包含程序 rm 的文件,然后通过系统调用请求内核在 myfile 上执行程序 rm。当进程 rm myfile 完成运行后,shell 将返回 UNIX 提示符 % 给用户,表明它正在等待进一步的命令。
1.4 shell
shell 充当用户和内核之间的接口。当用户登录时,登录程序会检查用户名和密码,然后启动另一个称为 shell 的程序。 shell 是一个命令行解释器 (CLI)。它解释用户输入的命令并安排它们执行。命令本身就是程序:当它们终止时,shell 会给用户另一个提示(在我们的系统上是 %)。
熟练的用户可以定制自己的shell,用户可以在同一台机器上使用不同的shell。如:学校的教职员工和学生默认使用 tcsh shell。ubuntu用bash等。
tcsh shell 有一些特性可以帮助用户输入命令。
文件名完成 - 通过键入命令、文件名或目录的部分名称并按 [Tab] 键,tcsh shell 将自动完成名称的其余部分。如果 shell 发现多个名称以您输入的那些字母开头,它会发出哔哔声,提示您在再次按 Tab 键之前再输入几个字母。
历史 - shell 保存您输入的命令的列表。如果您需要重复命令,请使用光标键上下滚动列表或输入历史以获取先前命令的列表。
二、常见shell命令
2.1 文件路径和查询
文件放在哪里?如何去查找?这是shell的基本操作。
2.2 关于文件的命令速查表
Command | Meaning |
---|---|
ls | list files and directories |
ls -a | list all files and directories |
mkdir | make a directory |
cd directory | change to named directory |
cd | change to home-directory |
cd ~ | change to home-directory |
cd .. | change to parent directory |
pwd | display the path of the current directory |
2.2 关于文件的产生、挪动处理
Command | Meaning |
---|---|
cp file1 file2 | copy file1 and call it file2 |
mv file1 file2 | move or rename file1 to file2 |
rm file | remove a file |
rmdir directory | remove a directory |
cat file | display a file |
less file | display a file a page at a time |
head file | display the first few lines of a file |
tail file | display the last few lines of a file |
grep 'keyword' file | search a file for keywords |
wc file | count number of lines/words/characters in file |
2.3 参数和重定位
Command | Meaning |
---|---|
command > file | redirect standard output to a file |
command >> file | append standard output to a file |
command < file | redirect standard input from a file |
command1 | command2 | pipe the output of command1 to the input of command2 |
cat file1 file2 > file0 | concatenate file1 and file2 to file0 |
sort | sort data |
who | list users currently logged in |
2.4 指令的帮助
Command | Meaning |
---|---|
* | match any number of characters |
? | match one character |
man command | read the online manual page for a command |
whatis command | brief description of a command |
apropos keyword | match commands with keyword in their man pages |
2.5 进程和权限
Command | Meaning |
---|---|
ls -lag | list access rights for all files |
chmod [options] file | change access rights for named file |
command & | run command in background |
^C | kill the job running in the foreground |
^Z | suspend the job running in the foreground |
bg | background the suspended job |
jobs | list current jobs |
fg %1 | foreground job number 1 |
kill %1 | kill job number 1 |
ps | list current processes |
kill 26152 | kill process number 26152 |
三、磁盘类shell命令
3.1 磁盘配额--quota
所有学生都在文件系统上分配了一定数量的磁盘空间来存放他们的个人文件,通常约为 100Mb。如果超出配额,您有 7 天的时间删除多余的文件。
要检查您当前的配额以及您已使用的配额,请键入
% quota -v
3.2 磁盘剩余空间--df
df 命令报告文件系统上的剩余空间。例如,要找出文件服务器上还剩多少空间,请键入
% df .
3.3 每个目录占用字节数--du
du 命令输出每个子目录使用的千字节数。如果您已经超过配额并且您想找出哪个目录包含最多的文件,这很有用。在您的主目录中,键入
% du -s *
-s 标志将仅显示摘要(总大小),* 表示所有文件和目录。
3.4 压缩文件--gzip
这会减小文件的大小,从而释放宝贵的磁盘空间。例如,键入
% ls -l science.txt
并使用 ls -l 记下文件的大小。然后压缩 science.txt,输入
% gzip science.txt
这将压缩文件并将其放在一个名为 science.txt.gz 的文件中
要查看大小的变化,请再次输入 ls -l。
要展开文件,请使用 gunzip 命令。
% gunzip science.txt.gz
3.5 查看压缩文件内容--zcat
zcat 将读取 gzip 压缩的文件,而无需先解压缩它们。
% zcat science.txt.gz
如果文本滚动得太快,请尽量少用管道输出。
% zcat science.txt.gz | less
3.6 查看文件分类--file
文件根据它们包含的数据类型对命名文件进行分类,例如 ascii(文本)、图片、压缩数据等。要报告主目录中的所有文件,请键入
% file *
3.7 文件比较--diff
此命令比较两个文件的内容并显示差异。假设您有一个名为 file1 的文件,并且您编辑了其中的一部分并将其保存为 file2。查看差异类型
% diff file1 file2
以 < 开头的行表示 file1,而以 > 开头的行表示 file2。
3.8 find
这将在目录中搜索具有给定名称、日期、大小或您要指定的任何其他属性的文件和目录。这是一个简单的命令,但有很多选项 - 您可以通过键入 man find 来阅读手册。
要搜索所有扩展名为 .txt 的文件,从当前目录 (.) 开始并遍历所有子目录,然后将文件名打印到屏幕上,请键入
% find . -name "*.txt" -print
要查找大小超过 1Mb 的文件,并将结果显示为长列表,请键入
% find . -size +1M -ls
3.9 history
C shell 会保存您输入的所有命令的有序列表。根据输入的顺序,每个命令都有一个编号。
% history (show command history list)
如果您使用 C shell,您可以使用感叹号 (!) 轻松调用命令。
% !! (recall last command)
% !-3 (recall third most recent command)
% !5 (recall 5th command in list)
% !grep (recall last command starting with grep)
您可以通过键入来增加历史缓冲区的大小
% set history=100
四、软件包shell操作
我们的系统上安装了许多公共领域和商业软件包,可供所有用户使用。但是,学生可以在自己的主目录中下载和安装小软件包,这些软件通常只对他们个人有用。
安装软件需要几个步骤。
- 找到并下载源代码(通常是压缩的)
- 解压源代码
- 编译代码
- 安装生成的可执行文件
- 设置安装目录的路径
在上述步骤中,最困难的可能是编译阶段。
4.1 编译源代码
所有高级语言代码都必须转换为计算机可以理解的形式。例如,将 C 语言源代码转换为称为汇编语言的低级语言。然后将前一阶段生成的汇编语言代码转换为目标代码,这些目标代码是计算机可以直接理解的代码片段。编译程序的最后阶段涉及将目标代码链接到包含某些内置函数的代码库。这个最后阶段产生一个可执行程序。
手动完成所有这些步骤是复杂的,超出了普通用户的能力。已经为程序员和最终用户开发了许多实用程序和工具来简化这些步骤。
4.2 make 和 Makefile
make 命令允许程序员管理大型程序或程序组。它通过跟踪整个程序的哪些部分已更改来帮助开发大型程序,仅编译自上次编译以来已更改的程序部分。
make 程序从名为 Makefile 的文本文件中获取其编译规则集,该文件与源文件位于同一目录中。它包含有关如何编译软件的信息,例如优化级别,是否在可执行文件中包含调试信息。它还包含有关在何处安装已完成编译的二进制文件(可执行文件)、手册页、数据文件、依赖库文件、配置文件等的信息。
有些软件包要求您手动编辑 Makefile 以设置最终安装目录和任何其他参数。但是,现在许多软件包都与 GNU 配置实用程序一起分发。
4.3 配置configure
随着 UNIX 变体数量的增加,编写可以在所有变体上运行的程序变得越来越困难。开发人员经常无法访问每个系统,并且某些系统的特性因版本而异。 GNU 配置和构建系统简化了作为源代码分发的程序的构建。所有程序都是使用简单、标准化的两步过程构建的。程序构建器无需安装任何特殊工具即可构建程序。
配置 shell 脚本尝试猜测编译期间使用的各种系统相关变量的正确值。它使用这些值在包的每个目录中创建一个 Makefile。
编译包的最简单方法是:
- cd 到包含包源代码的目录。
- 键入 ./configure 为您的系统配置软件包。
- 输入 make 编译包。
- 或者,键入 make check 以运行软件包附带的任何自检。
- 键入 make install 以安装程序以及任何数据文件和文档。
- (可选)键入 make clean 以从源代码目录中删除程序二进制文件和目标文件
配置实用程序支持多种选项。您通常可以使用 --help 选项来获取特定配置脚本的有趣选项列表。
您可能会使用的唯一通用选项是 --prefix 和 --exec-prefix 选项。这些选项用于指定安装目录。
--prefix 选项命名的目录将保存与机器无关的文件,例如文档、数据和配置文件。
由 --exec-prefix 选项命名的目录(通常是 --prefix 目录的子目录)将保存与机器相关的文件,例如可执行文件。
4.4 下载源代码
对于这个例子,我们将下载一个在不同测量单位之间转换的免费软件。
首先创建一个下载目录
% mkdir download
Download the software here and save it to your new download directory.
4.5 解压源代码
进入您的下载目录并列出内容。
% cd download
% ls -l
如您所见,文件名以 tar.gz 结尾。 tar 命令将多个文件和目录转换为一个 tar 文件。然后使用 gzip 命令对其进行压缩(以创建 tar.gz 文件)。
首先使用 gunzip 命令解压缩文件。这将创建一个 .tar 文件。
% gunzip units-1.74.tar.gz
然后解压 tar 文件的内容。
% tar -xvf units-1.74.tar
再次列出下载目录的内容,然后转到 units-1.74 子目录。
% cd units-1.74
4.6 配置和生成Makefile
首先要做的是仔细阅读自述文件和安装文本文件(使用 less 命令)。这些包含有关如何编译和运行软件的重要信息。
units 包使用 GNU 配置系统来编译源代码。我们需要指定安装目录,因为默认设置是您没有写入权限的主系统区域。我们需要在您的主目录中创建一个安装目录。
% mkdir ~/units174
然后运行配置实用程序,将安装路径设置为此。
% ./configure --prefix=$HOME/units174
注意:$HOME 变量是环境变量的一个示例。 $HOME 的值是您的主目录的路径。只需键入
% echo $HOME
显示此变量的内容。我们将在后面的章节中了解有关环境变量的更多信息。
如果配置运行正确,它将创建一个包含所有必要选项的 Makefile。您可以根据需要查看 Makefile(使用 less 命令),但不要编辑其中的内容。
4.7编译软件包 package
现在您可以通过运行 make 命令继续构建包。
% make
一两分钟后(取决于计算机的速度),将创建可执行文件。您可以通过键入来检查是否成功编译了所有内容
% make check
如果一切正常,您现在可以安装该软件包。
% make install
这会将文件安装到您之前创建的 ~/units174 目录中。
4.8 执行软件
您现在已准备好运行该软件(假设一切正常)。
% cd ~/units174
如果您列出units 目录的内容,您将看到许多子目录。
bin | The binary executables |
info | GNU info formatted documentation |
man | Man pages |
share | Shared data files |
要运行程序,请切换到 bin 目录并键入
% ./units
As an example, convert 6 feet to metres.
You have: 6 feet
You want: metres
* 1.8288
如果你得到答案 1.8288,那么恭喜你,它成功了。
要查看它可以转换的单位,请查看共享目录中的数据文件(列表非常全面)。
要阅读完整的文档,请切换到 info 目录并输入
% info --file=units.info
4.9 瘦掉不必要代码
在开发软件时,程序员将调试信息包含在生成的可执行文件中是很有用的。这样,如果在运行可执行文件时遇到问题,程序员可以将可执行文件加载到调试软件包中并跟踪任何软件错误。
这对程序员很有用,但对用户来说是不必要的。我们可以假设该软件包一旦完成并可供下载,就已经经过测试和调试。但是,当我们编译上面的软件时,调试信息仍然被编译成最终的可执行文件。由于我们不太可能需要此调试信息,因此我们可以将其从最终的可执行文件中删除。这样做的一个优点是可执行文件更小,运行速度应该稍快一些。
我们要做的是查看二进制文件的前后大小。首先切换到单元安装目录的 bin 目录。
% cd ~/units174/bin
% ls -l
如您所见,该文件的大小超过 100 KB。您可以使用 file 命令获取有关文件类型的更多信息。
% file units
单位:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1,动态链接(使用共享库),未剥离
要从二进制文件中去除所有调试和行号信息,请使用 strip 命令
% strip units
% ls -l
如您所见,该文件现在是 36 KB - 其原始大小的三分之一。二进制文件的三分之二是调试代码!!!
再次检查文件信息。
% file units
单位:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1,动态链接(使用共享库),剥离
有时,您可以在安装软件包时使用 make 命令安装所有二进制文件的预剥离副本。无需输入 make install,只需输入 make install-strip
五、Unix变量
5.1 UNIX 变量
变量是在运行程序时将信息从 shell 传递给程序的一种方式。程序在“环境中”查找特定变量,如果找到它们将使用存储的值。有些是由系统设置的,有些是由你设置的,还有一些是由 shell 设置的,或者任何加载另一个程序的程序。 标准 UNIX 变量分为两类,环境变量和 shell 变量。从广义上讲,shell 变量只适用于当前的 shell 实例,用于设置短期工作条件;环境变量具有更深远的意义,登录时设置的变量在会话期间有效。按照惯例,环境变量的名称为大写,shell 变量的名称为小写。
5.2 环境变量
环境变量的一个示例是 OSTYPE 变量。 this 的值是您正在使用的当前操作系统。类型
% echo $OSTYPE
更多例子如下:
- USER (your login name)
- HOME (the path name of your home directory)
- HOST (the name of the computer you are using)
- ARCH (the architecture of the computers processor)
- DISPLAY (the name of the computer screen to display X windows)
- PRINTER (the default printer to send print jobs)
- PATH (the directories the shell should search to find a command)
如何找出这些变量的当前值?
ENVIRONMENT 变量使用 setenv 命令设置,使用 printenv 或 env 命令显示,使用 unsetenv 命令取消设置。要显示这些变量的所有值,请键入
% printenv | less
5.3 Shell变量
shell 变量的一个例子是历史变量。这个值是要保存多少个 shell 命令,允许用户回滚他们之前输入的所有命令。类型
% echo $history
更多shell 变量如下:
- cwd (your current working directory)
- home (the path name of your home directory)
- path (the directories the shell should search to find a command)
- prompt (the text string used to prompt for interactive commands shell your login shell)
5.4 找出这些变量的当前值。
使用 set 命令设置和显示 SHELL 变量。可以使用 unset 命令取消设置。 要显示这些变量的所有值,请键入
% set | less
5.5 什么是 PATH 和path区别 ?
通常,具有相同名称(除了大小写)的环境变量和 shell 变量是不同且独立的,除了可能具有相同的初始值。然而,也有例外。
每次更改 shell 变量 home、user 和 term 时,相应的环境变量 HOME、USER 和 TERM 都会收到相同的值。但是,更改环境变量对相应的 shell 变量没有影响。
PATH 和路径指定搜索命令和程序的目录。两个变量始终代表同一个目录列表,并且自动更改其中一个会导致另一个更改。
5.6 使用和设置变量
每次您登录 UNIX 主机时,系统都会在您的主目录中查找初始化文件。这些文件中的信息用于设置您的工作环境。 C 和 TC shell 使用两个名为 .login 和 .cshrc 的文件(请注意,两个文件名都以点开头)。
登录时,C shell 首先读取 .cshrc,然后是 .login
.login 登录是设置适用于整个会话的条件,并执行仅在登录时相关的操作。
.cshrc 用于设置条件并执行特定于 shell 及其每次调用的操作。
注意的是在 .login 文件中设置 ENVIRONMENT 变量,在 .cshrc 文件中设置 SHELL 变量。
警告:切勿将运行图形显示的命令(例如网络浏览器)放入 .cshrc 或 .login 文件中。
5.7 设置 .cshrc 文件的shell变量
例如,要更改历史列表中保存的 shell 命令的数量,您需要设置 shell 变量 history。默认情况下设置为 100,但您可以根据需要增加此值。
% set history = 200
通过键入检查这是否有效
% echo $history
但是,这只是为当前 shell 的生命周期设置了变量。如果你打开一个新的 xterm 窗口,它只会设置默认的历史值。要永久设置历史记录的值,您需要将 set 命令添加到 .cshrc 文件。
首先在文本编辑器中打开 .cshrc 文件。 nedit 是一个简单易用的编辑器。
% nedit ~/.cshrc
在其他命令列表之后添加以下行。
set history = 200
保存文件并强制 shell 使用 shell source 命令重新读取其 .cshrc 文件。
% source .cshrc
通过键入检查这是否有效
% echo $history
5.8 设定路径变量
当您键入命令时,您的路径(或 PATH)变量定义了 shell 将在哪些目录中查找您键入的命令。如果系统返回一条消息说“命令:找不到命令”,这表明该命令在系统上根本不存在,或者它根本不在您的路径中。
例如,要运行单元,您要么需要直接指定单元路径 (~/units174/bin/units),要么需要在路径中包含目录 ~/units174/bin。
您可以通过发出以下命令将其添加到现有路径的末尾($path 表示此路径):
% set path = ($path ~/units174/bin)
通过尝试在除单元实际所在的任何目录中运行单元来测试这是否有效。
% cd
% units
要永久添加此路径,请在其他命令列表之后将以下行添加到您的 .cshrc 中。
set path = ($path ~/units174/bin)