Top

D1:介绍、学习Shell之一

目录:

介绍

这不是一部关于Linux系统管理的书。 主要针对现代Linux命令行用户。

此书分四个部分: 作者建议从头到尾阅读此书。此书不是作为参考书编写的,它更像是一个有开始、中间、结尾的故事。
要学习次数,需要搭建一个学习环境。以下两种方法选其一:
  1. 在一台(不是很新的)电脑上安装Linux
  2. 哪个发行版都行。2G内存和6G可用磁盘空间。尽可能避免使用笔记本电脑和无线网络,硬件驱动可能会造成障碍。
  3. 使用LiveCD或U盘
  4. 大多数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。

导航

本章介绍以下命令:

理解文件系统树

类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)路径名从工作目录开始。使用两个特殊的符号来表示文件系统树中的相对位置:
一些有用的捷径

文件名重要事项

  1. 以点开头的文件名将被隐藏。只有使用ls -a时才能显示出来。
  2. 创建账户时,几个隐藏文件会被放置在用户的主目录里,用于配置账户环境变量等。一些应用程序也会将自己的配置文件作为隐藏文件放置在主目录中。
  3. 类Unix系统中的文件名和命令区分大小写。
  4. Linux没有”文件扩展名“概念。
  5. 尽管类Unix系统不使用文件扩展名,但许多应用程序会使用扩展名来确定文件的用途和内容。
  6. 尽管Linux支持包含嵌入空格和标点符号的长文件名,但建议创建的文件名中的标点符号限制在句号、破折号和下划线。
  7. 不要在文件名中嵌入空格。

探索系统

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选项下列出的文件按模式包括条目类型和权限,条目类型字符描述文件的类型:

使用file命令探测文件类型

file命令可以探测文件类型,它测试每个参数,试图对文件进行分析。有三组测试,按顺序执行:文件系统测试、魔法测试、语言测试。第一个成功的测试会导致打印文件类型。

输出的类型通常包含以下内容之一:

使用less命令查看文件内容

less命令可以查看文本文件的内容。
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系统中,一个文件可能被多个名称引用。

还有一种类型的链接称为硬链接。