D1:介绍、学习Shell之一
介绍
Freedom is the power to decide what your computer does, and the only way to have this freedom is to know what your computer is doing.
Freedom is a computer that is without secrets, one where everythin can be known if you care enough to find out.
graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible.(有点自恋)
One of the strongest reasons early adopters of Linux chose it over, say, Windows NT was the powerful command line interface that made the "difficult tasks possible".
Linux跟NT有关?存疑。
In some quarters, it's politically correct to call the Linux operating system the "GNU/Linux operating system".
Technically speaking, Linux is the name of the operating system's kernel,nothing more.
这不是一部关于Linux系统管理的书。
主要针对现代Linux命令行用户。
此书分四个部分:
- 学习Shell
命令的结构、文件系统导航、命令行编辑,以及查找命令的帮助和文档。
- 配置和环境
从命令行编辑控制计算机操作的配置文件。
- 通用任务和基本工具
类Unix操作系统经典的命令。
- 写Shell脚本
脚本用于自动化许多常见的计算任务。
作者建议从头到尾阅读此书。此书不是作为参考书编写的,它更像是一个有开始、中间、结尾的故事。
要学习次数,需要搭建一个学习环境。以下两种方法选其一:
- 在一台(不是很新的)电脑上安装Linux
哪个发行版都行。2G内存和6G可用磁盘空间。尽可能避免使用笔记本电脑和无线网络,硬件驱动可能会造成障碍。
- 使用LiveCD或U盘
大多数Linux发行版都可以从LiveCD或U盘运行,而不需要安装。但与上面方法相比可能会比较慢。
无论使用哪种方法,在学习过程中都可能会需要超级用户权限。
学习Shell
几乎所有Linux发行版都提供一个名为bash的shell程序。bash是"Bourne Again SHell"的缩写,意思是:bash是sh的增强替代品。
终端仿真程序——Terminal Emulators,运行后可以看到被称为shell prompt(shell提示符)的界面:
[me@linuxbox ~]$
通常对于普通用户显示$符号,而对于超级用户会显示#符号。
对于胡乱的输入,会收到类似以下的提示:
[me@linuxbox ~]$ kdksfewfwef
bash: kdksfewfwef: command not found
按上箭头,可以看到使用过的命令,这叫做命令历史。默认情况下大多数Linux提供至少1000个命令的记忆。
不要试图使用Ctrl-c和Ctrl-v在终端窗口内执行复制和粘贴,这些控制代码对shell有不同的含义。
尝试一些简单的命令
使用date命令显示当前日期、时间:
[me@linuxbox ~]$ date
Thu Mar 8 15:09:41 EST 2018
使用cal命令显示当前月份的日历:
[me@linuxbox ~]$ cal
March 2018
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
使用df命令显示当前磁盘上空间使用情况:
[me@linuxbox ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 15115452 5012392 9949716 34% /
/dev/sda5 59631908 26545424 30008432 47% /home
/dev/sda1 147764 17370 122765 13% /boot
tmpfs 256856 0 256856 0% /dev/shm
使用free命令显示可用内存量(FreeBSD没有此命令):
[me@linuxbox ~]$ free
total used free shared buffers cached
Mem: 513712 503976 9736 0 5312 122916
-/+ buffers/cache: 375748 137964
Swap: 1052248 104712 947536
当要退出终端进程,可以关闭终端仿真程序窗口,或使用exit命令,或按Ctrl-d键。
大多数Linux发行版上,通过Ctrl-Alt-F1到Ctrl-Alt-F6可以切换六个控制台终端。大多数系统上,按Alt-F7可以返回图形桌面。
FreeBSD使用Alt-F1到F8,对应ttyv0到ttyv7。
导航
本章介绍以下命令:
- pwd
显示当前工作目录
- cd
改变目录
- ls
列出目录中的内容
理解文件系统树
类Unix操作系统也是采用所谓分层目录结构来组织文件。这意味着它们以树状目录模式组织。有些系统称为文件夹(folder)。
文件系统中的第一个目录称为根目录。根目录包含文件和子目录。
Windows为每个存储设备设置一个单独的文件系统树,而类Unix系统只有一个文件系统树,不论计算机上连接了多少个驱动器或存储设备。
存储设备被挂载(mount)到树上指定节点(挂载点mountpoint)上。
当前工作目录
在图形界面下,图形文件管理器可以以树状结构显示文件系统树,但是在命令行模式无法显示图片,需要使用pwd(print woking directory)命令来确定当前是在哪个目录:
[me@linuxbox ~]$ pwd
/home/me
初登入系统时,当前的工作目录被设置为用户的主目录(home directory)。每个账户都有自己的主目录,它是普通用户唯一允许写入文件的地方。
列出目录的内容
使用ls命令列出当前工作目录中包含的文件和目录:
[me@linuxbox ~]$ ls
Desktop Documents Music Pictures Public Templates Videos
改变当前工作目录
使用cd命令可以更改工作目录。路径名分绝对路径名和相对路径名。
绝对路径名
绝对(absolute)路径名从根目录开始,然后一个分支接一个分支地跟随树分支,直到完成到所需目录或文件地路径。
相对路径
相对(relative)路径名从工作目录开始。使用两个特殊的符号来表示文件系统树中的相对位置:
一些有用的捷径
- cd
切换工作目录到主目录
- cd -
切换工作目录到上一次工作目录
- cd ~user_name
切换工作目录到user_name的主目录。
文件名重要事项
- 以点开头的文件名将被隐藏。只有使用ls -a时才能显示出来。
创建账户时,几个隐藏文件会被放置在用户的主目录里,用于配置账户环境变量等。一些应用程序也会将自己的配置文件作为隐藏文件放置在主目录中。
- 类Unix系统中的文件名和命令区分大小写。
- Linux没有”文件扩展名“概念。
尽管类Unix系统不使用文件扩展名,但许多应用程序会使用扩展名来确定文件的用途和内容。
- 尽管Linux支持包含嵌入空格和标点符号的长文件名,但建议创建的文件名中的标点符号限制在句号、破折号和下划线。
不要在文件名中嵌入空格。
探索系统
- ls
列出目录中的内容
- file
测定文件类型
- less
查看文件内容
ls更多使用技巧
除了当前工作目录外,可以指定要列出的目录:
[me@linuxbox ~]$ ls /usr
bin games include lib local sbin share src
也可以指定多个目录:
[me@linuxbox ~]$ ls ~ /usr
/home/me:
Desktop Documents Music Pirctures Public Templates Videos
/usr:
bin games include lib local sbin share src
还可以更改输出的格式以显示更多细节:
[me@linuxbox ~]$ ls -l
total 56
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Desktop
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Documents
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Music
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Pictures
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Public
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Templates
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Videos
以上通过在命令中添加-l,将输出更改为长格式(long format)。
选项和参数
大多数命令后面通常可以有一个或多个修改其行为的选项,以及一个或多个参数,这些参数时命令所依据的项。所以大多数命令看起来像这样:
command -optinos arguments
大多数命令使用的选项有一个破折号加字符组成,例如-l。然而许多命令也支持长选项,由两个破折号加一个单词组成。
许多命令允许将多个短选项串在一起。例如:
[me@linuxbox ~]$ ls -lt --reverse
ls命令有很多可用选项,最常用的有:
选项 |
长选项 |
说明 |
-a |
--all |
列出所有文件,甚至那些以句点开头的文件,这些文件通常不会列出(即隐藏。) |
-A |
--almost-all |
与-a选项类似,但不列出.(当前目录)和..(父目录)。 |
-d |
--directory |
通常,如果指定了目录,ls将列出目录的内容,而不是目录本身。 此选项常与-l选项结合使用可以查看有关目录的详细信息,而不是其内容。 |
-F |
--classify |
此选项将在每个列出的名称默认附加一个指定符号。
例如,如果名称是目录,则使用正斜杠(/)。 |
-h |
--human-readable |
在长格式列表中,以人类可读的格式而不是字节显示文件大小。 |
-l |
|
以长格式显示结果。 |
-r |
--reverse |
按倒序显示结果。 通常ls命令按文件名字母升序显示结果。 |
-S |
|
按文件大小倒序排列。
虽热没有选项可以按文件大小的正序排列,但可以用ls -Sr来实现此目的。 |
-t |
|
按编辑时间顺序排列。 |
对长格式的深入研究
ls长格式字段:
字段 |
说明 |
-rw-r--r-- |
对文件的访问权限。
第一个字符表示文件类型。在不同类型中,前导破折号表示常规文件,"d"表示目录。
接下来三个字符是文件所有这的访问权限,中间三个字符是文件组成员的访问权限,最后三个字符是其他所有人的访问权限。
|
1 |
文件的硬链接数。 |
root |
文件所有者的用户名。 |
root |
文件所有者的组名。 |
32059 |
文件大小(以字节为单位)。 |
2007-04-03 11:05 |
文件最后一次编辑的日期和时间。 |
oo-cd-cover.odf |
文件名。 |
在FreeBSd中,ls -l默认可以简写为ll(默认在~/.cshrc文件中定义了对应的别名)。
abc@pc:~ # ll
-rw-r--r-- 2 root wheel 1023 Apr 9 2021 .cshrc
-rw------- 1 root wheel 726 Jan 16 16:38 .history
-rw-r--r-- 1 root wheel 80 Arr 9 2021 .k5login
长格式显示每个文件的文件模式、链接数量、所有者名称、组名称、MAC标签、文件中的字节数、缩写月份、最后一次编辑的日期、最后一次编辑的小时、分钟、路径名。
如果文件的编辑时间超过6个月,且未指定-D或-T,则最后一次修改的年份将显示在小时和分钟字段的位置。
如果所有者或组名不是已知的用户或组名,或者给出了-n选项,则会显示数字ID。
如果文件是字符特殊文件或块特殊文件,则文件的设备号将显示在size字段中。如果文件是符号链接,则链接到的文件的路径名前面会有“->”。
目录内容列表的前面是文件系统中被列为目录内容的文件(可能包括也可能不包括.和..以及其他以点开头的文件,具体取决于其他选项)使用的带标签的块总数。
默认块大小为512字节。可以使用选项-k或环境变量BLOCKSIZE设置块大小。输出中的块数将被四舍五入,因此字节数至少与相应文件系统块使用的字节数相同。
在-l选项下列出的文件按模式包括条目类型和权限,条目类型字符描述文件的类型:
- -:普通文件
- b:阻止特殊文件
- c:字符特殊文件
- d:目录
- l:符号链接
- p:FIFO(定名管道?)
- s:套接字
- w:空白
使用file命令探测文件类型
file命令可以探测文件类型,它测试每个参数,试图对文件进行分析。有三组测试,按顺序执行:文件系统测试、魔法测试、语言测试。第一个成功的测试会导致打印文件类型。
输出的类型通常包含以下内容之一:
- text
文件仅包含打印字符和几个常用控制字符,在ASCII终端上读取可能是安全的
- executable
文件包含以某种UNIX内核或其他内核可以理解的形式编译程序的结果
- data
数据通常是“二进制”或不可打印的
- 文件系统测试基于检查stat(2)系统调用的返回值。程序会检查文件是否为空,或者它是否是某种特殊文件。
如果在系统头文件<sys/stat.h>中定义了适用于您正在运行的系统的任何已知文件类型(套接字、符号链接或实现它们的系统上的命名管道(FIFO)),则这些文件类型都是Intuite的。
- 魔法测试用于检查包含特定固定格式数据的文件。
这方面的典型例子是二进制可执行文件(编译程序)a.out文件,其格式在标准include目录中的<elf.h>、<a.out.h>和可能的<exec.h>中定义。
这些文件在文件开头附近的特定位置存储了一个“幻数(magic number)”,告诉UNIX操作系统该文件是二进制可执行文件,以及几种类型中的哪一种。
“魔法”的概念已扩展应用于数据文件。任何在文件中的固定小偏移量处具有某种不变标识符的文件通常都可以这样描述。
识别这些文件的信息从编译后的magic文件/usr/share/misc/magic.mgc中读取,如果编译后的文件不存在,则从/usr/share/misc/magic目录中的文件中读取。
此外,如果$HOME/.magic.mgc或$HOME/.magic存在,将优先使用系统魔法文件。
如果一个文件与魔法文件中的任何条目都不匹配,就会检查它是否是文本文件。ASCII、ISO-8859-x、非ISO 8位扩展ASCII字符集(例如在Macintosh和IBM PC系统上使用的字符集)、UTF-8编码的Unicode、UTF-16编码的Unicode和EBCDIC字符集可以通过构成每个字符集中可打印文本的不同字节范围和序列来区分。
如果一个文件通过了这些测试中的任何一个,就会报告它的字符集。ASCII、ISO-8859-x、UTF-8和扩展ASCII文件被标识为“文本”,因为它们在几乎任何终端上都是可读的;UTF-16和EBCDIC只是“字符数据”,因为虽然它们包含文本,但在读取之前需要翻译文本。此外,文件将尝试确定文本类型文件的其他特征。
如果文件的行由CR、CRLF或NEL终止,而不是由Unix标准LF终止,则会报告此情况。还将识别包含嵌入式转义序列或过串的文件。
- 一旦文件确定了文本类型文件中使用的字符集,它将尝试确定文件是用语言编写的。
语言测试寻找特定的字符串,这些字符串可以出现在文件前几个块的任何地方。
- 任何使用以上方法无法识别的文件都被简单地称为“data”。
使用less命令查看文件内容
less命令可以查看文本文件的内容。
less常用的子命令:
- PageUp或b——向上翻一页
- PageDown或空格——向下翻一页
- 上箭头——向上翻一行
- 下箭头——向下翻一行
- G——移动到文本文件的最后
- 1G或g——移动到文本文件的开头
- /字符——向后查找字符
- n——继续搜索下一个
- h——显示帮助
- q——退出less
less是作为早期Unix程序more的改进替代品而设计的。less取自于“less is more”——这是一个现代主义建筑师和设计师座右铭。
在FreeBSD的manpage中,more指向less。此命令基于more和vi。
导览
大多数Linux发行版的文件系统布局遵从Linux Filesystem Hierarchy Standard(Linux文件系统层次结构标准)。
目录 |
说明 |
/dev |
这是一个包含device nodes(设备节点)的特殊目录。 “Everything is a file”也适用于设备。内核在此维护一个它能理解的所有设备的列表。 |
/etc |
/etc目录包含所有系统级配置文件。它还包含一组shell脚本,这些脚本在引导时启动每个系统服务。此目录中的所有内容都应是可读文本。
- /etc/crontab 定义自动作业合适运行的文件
- /etc/fstab 存储设备及其相关挂载点的表
- /etc/passwd 用户账号列表
|
/home |
在正常配置中,每个用户在/home中都有一个目录。普通用户只能在其主目录中写入文件。此限制可以保护系统不受错误用户活动的影响。 |
/lib |
包含核心系统程序使用的共享库文件。类似于Windows中的动态链接库(Dynamic Link Libraries, DLLs)。 |
/lost+found |
每个使用Linux文件系统(类如ext4)格式化的分区或设备都有这个目录。 它用于从文件系统损坏事件中进行部分恢复。 除非系统除了问题,否则这个目录保持为空 |
/media |
在现代Linux系统上,/media目录将包含可移动介质(如USB驱动器、CD-ROM等)的装入点,这些介质在插入时会自动装入。 |
/mnt |
在较旧的Linux系统上,/mnt目录包含手动装载的可移动设备的装载点。 |
/opt |
/opt目录用于安装“可选(optional)”软件。这主要用于存放可能安装在系统上的商业软件产品。 FreeBSD没有此目录 |
/proc |
/proc是个特殊目录。从存储在硬盘上的文件来看,它不是一个真正的文件系统。相反,它是一个由Linux内核维护的虚拟文件系统。
它包含的文件是内核本身的窥视孔(peepholes)。这些文件是可读的,可以让我们了解内核如何看待计算机。
FreeBSD中此目录为空 |
/root |
这是root账号的主目录。 |
/sbin |
此目录包含系统二进制文件。这些程序执行通常为超级用户保留的重要系统任务。 |
/tmp |
/tmp目录用于存储由各种程序创建的临时文件。某些配置会导致每次重启系统时会清空此目录。 |
/usr |
/usr目录树可能是Linux系统上最大的目录树。它包含普通用户使用的所有程序和支持文件。 |
/usr/bin |
包含Linux发行版安装的可执行程序。此目录包含数千个程序并不罕见。 |
/usr/lib |
/usr/bin中程序的共享库。 |
/usr/local |
此目录树是安装未包含在发行版中但打算在系统范围内使用的程序的地方。 根据源代码编译的程序通常安装在/usr/local/bin中。
在新安装的Linux系统上,此树存在,但初始是空的。 |
/usr/sbin |
包含更多系统管理程序。 |
/usr/share |
包含/usr/bin中程序使用的所有共享数据。这包括默认配置文件、图标、屏幕背景、声音文件等。 |
/usr/share/doc |
很多软件包安装到系统时会包含各种文档,这些文档一般会保存在/usr/share/doc目录下。 |
/var |
除了/tmp和/home外,多数目录是相对静态的,也就是说内容没有改变。/var目录树是存储可能更改的数据的地方,这里有各种数据库、假脱机文件、用户邮件等。 |
/var/log |
包含log files、各种系统活动的记录。应经常监测。最有用的是/var/log/messages和/var/log/syslog。
注意:处于安全原因,在某些系统上,只有超级用户可以查看日志文件。 |
符号链接
有些目录列表中会有类似以下的条目:
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
此条目的第一个字母是“l”,条目似乎有两个文件名。这是一种特殊的文件,称为符号链接(symbolic link),也称为软链接(soft link)。
在多数类Unix系统中,一个文件可能被多个名称引用。
还有一种类型的链接称为硬链接。