第一部分 学习shell

第一部分-学习shell

shell是一个接收由键盘输入的命令,并将其传递给操作系统来执行的程序。

第一章 什么是Shell

1.1终端仿真器

当使用图形用户界面时,需要另一种叫做终端仿真器(terminal emulator)的程序与shell进行交互。

1.2 第一次键盘输入

image-20230303075554381

1.2.1命令历史记录

如果按下向上方向指示键,将会看到先前的命令kaekfjaeifj再一次出现在 提示符的后面,这称为命令历史记录。在默认情况下,大部分Linux发行 版本能够存储最近输入的500个命令。按下向下方向指示键,则先前的命令消失。

1.2.2光标移动

再次按下向上方向指示键,重新调用先前的命令,然后分别按下向左和向右方向指示键,看看如何将光标定位到命令行的任意位置。

1.3几个简单命令

系统时间和日期

1
2
(base) wyx@microbe-System-Product-Name:~$ date
2023年 03月 03日 星期五 07:57:42 CST

当前月的日历

1
2
3
4
5
6
7
8
(base) wyx@microbe-System-Product-Name:~$ cal
三月 2023
日 一 二 三 四 五 六
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

查看磁盘驱动器当前的可用空间

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
32
33
34
35
36
37
38
39
(base) wyx@microbe-System-Product-Name:~$ df
文件系统 1K-块 已用 可用 已用% 挂载点
udev 49376016 0 49376016 0% /dev
tmpfs 9880236 2044 9878192 1% /run
/dev/sda2 479079112 55672484 398997236 13% /
tmpfs 49401176 0 49401176 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 49401176 0 49401176 0% /sys/fs/cgroup
/dev/loop0 512 512 0 100% /snap/gnome-characters/781
/dev/loop1 457088 457088 0 100% /snap/gnome-42-2204/44
/dev/loop2 51072 51072 0 100% /snap/snapd/17950
/dev/loop3 64896 64896 0 100% /snap/core20/1778
/dev/loop4 354688 354688 0 100% /snap/gnome-3-38-2004/119
/dev/loop5 768 768 0 100% /snap/gnome-logs/115
/dev/loop6 1536 1536 0 100% /snap/gnome-system-monitor/181
/dev/sda1 523248 29164 494084 6% /boot/efi
/dev/sdb2 3844533232 1097744044 2551422788 31% /home
/dev/loop7 74752 74752 0 100% /snap/core22/522
/dev/loop8 463360 463360 0 100% /snap/gnome-42-2204/56
/dev/loop9 2688 2688 0 100% /snap/gnome-system-monitor/178
/dev/loop10 354688 354688 0 100% /snap/gnome-3-38-2004/115
/dev/loop11 83328 83328 0 100% /snap/gtk-common-themes/1534
/dev/loop12 74752 74752 0 100% /snap/core22/509
tmpfs 9880232 16 9880216 1% /run/user/121
/dev/loop13 64896 64896 0 100% /snap/core20/1822
/dev/loop14 224256 224256 0 100% /snap/gnome-3-34-1804/77
/dev/loop15 768 768 0 100% /snap/gnome-characters/741
/dev/loop16 2688 2688 0 100% /snap/gnome-calculator/920
/dev/loop17 56960 56960 0 100% /snap/core18/2697
/dev/loop18 224256 224256 0 100% /snap/gnome-3-34-1804/72
/dev/loop19 2560 2560 0 100% /snap/gnome-calculator/884
/dev/loop20 128 128 0 100% /snap/bare/5
/dev/loop21 93952 93952 0 100% /snap/gtk-common-themes/1535
/dev/loop22 56960 56960 0 100% /snap/core18/2679
/dev/loop23 51072 51072 0 100% /snap/snapd/18357
/dev/loop24 640 640 0 100% /snap/gnome-logs/112
tmpfs 9880232 64 9880168 1% /run/user/1014
tmpfs 9880232 0 9880232 0% /run/user/1018

显示可用内存

1
2
3
4
(base) wyx@microbe-System-Product-Name:~$ free
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 98802352 4754444 84879532 28500 9168376 93033984
交换: 2097148 0 2097148

1.4结束终端会话

image-20230303080129518

第2章 导航

2.1文件系统树

类Unix操作系统使用分层目录结构的方式来组织文件。

文件系统的第一个目录叫做根目录,包含文件和子目录。

windows系统每个存储设备都有一个独立的文件系统树,但是在linux中,无论有多少驱动器和存储设备,通常只有一个文件树。

2.2当前工作目录

使用pwd显示当前工作目录

1
2
(base) wyx@microbe-System-Product-Name:~$ pwd
/home/wyx

2.3列出目录内容

1
2
(base) wyx@microbe-System-Product-Name:~$ ls
anaconda3 Anaconda3-2022.10-Linux-x86_64.sh examples.desktop MSA-Robustness

2.4更改当前工作目录

使用cd命令可以改变工作目录(即在文件系统树的位置);只需输入cd命令,然后再输入目标工作目录的路径名即可。

  • 绝对路径
  • 相对路径

2.4.1绝对路径名

1
2
(base) wyx@microbe-System-Product-Name:~$  cd /usr/bin
(base) wyx@microbe-System-Product-Name:/usr/bin$

image-20230303081311498

2.4.2相对路径名

它通常使用一些特殊符号来表示文件系统树中的相对位置,这些特殊符号是“.”(点)和“..”(点点)。

“.” 代表工作目录,”..”代表工作目录的父目录

从/usr/bin回到父目录

1
2
3
cd /usr

cd ..

从/usr到/usr/bin

1
2
3
4
5
cd /usr/bin

cd ./bin

cd bin

2.4.3一些有用的快捷方式

快捷方式 结果
cd 回到主目录
cd - 把工作目录改成先前的工作目录
cd ~username 将工作目录改为username的主目录

第3章 操作系统

3.1 ls命令

image-20230303082319410

指定要显示的目录

image-20230303082340877

指定多个目录

image-20230303082412289

展示更多细节

image-20230303082708973

3.1.1 选项和参数

ls命令包含了两个选项;l选项产生长格式输出,而t选项则表示以文件修改时间的先后将结果进行排序。

image-20230303083006111

以相反顺序输出

1
ls -lt --reverse
选项 长选项 含义
-a —all 列出所有文件,包括以点号开头的文件,这些文件通常是不列出来的
-d —directory 通常,如果指定了一个目录,ls命令会列出目录中的内容而不是目录本
-F —classify 选项会在每个所列出的名字后面加上类型指示符(例如,如果名字是目录名,则会加上一个斜杠)
-h —human-readable 以长格式列出,以人们可读的方式而不是字节数来显示文件大小
-l 使用长格式显示结果
-r —reverse 以相反的顺序显示结果。通常,ls命令按照字母升序排列显示结果
-S 按文件大小对结果排序
-t 按照修改时间排序

3.1.2 进一步了解长列表格式

image-20230303084604541

3.2 使用file命令确定文件类型

1
file filename

image-20230303085148597

3.3 less命令查看文件内容

1
less /etc/password

image-20230303085811698

一旦less程序运行起来,我们就可查看文件内容。如果文件不止一页,可以上下滚动文件。按Q键可退出less程序。

命令 功能
PAGE UP或b 后翻一页
PAGE DOWN或 前翻一页
向上箭头键 向上一行
向下箭头键 向下一行
G 跳转到文本文件的末尾
1G或g 跳转到文本文件的开头
/charecters 向前查找指定的字符串
n 向前查找下一个出现的字符串,这个字符串是之前所指定查
h 显示帮助屏幕
q 退出less

less命令属于“页面调度器(pagers)”程序类,这些程序允许通过一页一页的方式,轻松浏览很长的文本文档。而more程序只允许向前翻页,使用less命令既可以前后翻页,还具有很多其他的特性。

3.4 快速浏览

  1. 使用cd命令进入一个给定目录
  2. 使用ls -l命令列出目录内容
  3. 看到感兴趣的文件,使用file命令确定文件内容
  4. 如果文件看起来是一个文件,可以使用less命令浏览其内容
目录 内容
/ 根目录,一切从这里开始
/bin 包含系统启动和运行必须的二进制文件
/boot 包含Linux内核和最初的RAM磁盘映像(系统启动时,驱动程序会用到),以及启动加载程序。
有趣的文件:
/boot/grub/grub.conf或menu.lst,用来配置启动加载程序 ;
•/boot/vmlinuz,Linux内核
/dev 这是一个包含设备节点的特殊目录。”把一切当作文件“也适用于设备。内核将它能够识别的设备存放在这个目录里。
/etc /etc目录包含了所有系统层面的配置文件,同时含有一系列shell脚本,系统每次启动时,这些shell脚本都会打开每个系统服务。该目录中包含的内容都是可读的文本文件。
有趣的文件:
/etc/crontab,定义了自动化任务运行的时间
/etc/fstab,存储设备以及相关挂载点的列表
/etc/password,用户账号列表
/home 在通常的配置中,每个用户会在/home目录拥有一个属于自己的目录。普通用户只能在自己的主目录中创建文件,保护系统免遭错误的用户行为破坏。
/lib 包含核心系统程序使用的共享文件库,与windows的DDL类似
/lost+found 每个使用Linux文件系统的格式化分区或设备,例如ext3文件系统,都会有这个目录。当文件系统崩溃时,该目录用于恢复分区。除非系统真的发生很严重的问题,否则这个目录一直是空的
/media /media 包含了可移除媒体设备的挂载点
/mnt /mnt目录包含手动挂载的可移除设备的挂接点
/opt /opt目录用来安装其他可选的软件。主要用来存放可能安装在系统中
/proc /proc目录很特殊。从文件的角度来说,它不是存储在硬盘中的真正的文件系统,反而是一个Linux内核维护的虚拟文件系统。它包含的文件是内核的窥视孔。该文件是可读的,从中可以看到内核是如何监管计算机的。
/root root账户的主目录
/sbin 该目录放置“系统”二进制文件。这些程序执行重要的系统任务,这些任务通常是为超级用户预留的
/tmp /tmp是供用户存放各类程序创建的临时文件的目录。某些配置使得每次系统重启时都会清空该目录
/usr /usr目录可能是Linux系统中最大的目录树。它包含普通用户使用的所有程序和相关文件
/usr/bin /usr/bin目录中放置了一些Linux发行版安装的可执行程序。该目录通常会存储成千上万个程序
/usr/lib /usr/bin目录中的程序使用的共享库
/usr/local 这个/usr/local目录是并非系统发行版自带,但却打算让系统使用的程序的安装目录。由源代码编译好的程序通常安装在/usr/local/bin中。在一个新安装的Linux系统中,就存在这一个目录,但却是空目录,直到系统管理员向其中添加内容
/usr/sbin 包含更多的系统管理程序
/usr/share /usr/share目录里包含了/usr/bin中的程序所使用的全部共享数据,这包括默认配置文件、图标、屏幕背景、音频文件等
/usr/share/doc 安装在系统中的大部分程序包包含一些文档文件。在/usr/share/doc中,文档文件是按照软件包来组织分类的
/var 除了/tmp和/home目录之外,目前看到的目录相对来说都是静态的;也就是说,其包含的内容是不变的。而那些可能改变的数据存储在/var目录树里。各种数据库、假脱机文件、用户邮件等都存储在这里
/var/log /var/log目录包含的日志文件,记录了各种系统活动。这些文件非常重要,并且应该时不时地监控它们。其中最有用的文件是/var/log/messages。注意,为了安全起见,在一些系统里,必须是超级用户才能查看日志文件

3.5 符号链接

浏览过程中看到以下条目的目录信息

1
lrwxrwxrwx 1 root root 11 2012-08-11 07:34 libc.so.6 -> libc-2.6.so

注意,该条目信息的第一个字母是l,而且看起来像是有两个文件名。这种特殊的文件叫做符号链接(又叫软链接或symlink)。protoc 指定为 arch_64 版本

在大多类UNIX系统中,一个文件很可能采用多个名字引用。

某个程序需要使用foo文件中的一个共享资源,文件名包含了版本号,但是foo的版本变化频繁,版本变化后,如果名称变化,就必须跟踪每个可能使用该共享资源的程序,安装了该资源的版本后,都要让使用该资源的程序去寻找新的资源名字。

创建一个符号链接foo指向foo-2.6,打开foo文件其实就是意味着打开foo-2.6。升级到2.7时,将文件添加到系统里,删除符号链接文件,创建指向新版本的符号链接即可。

解决了版本问题,还保存了原有的版本文件。

硬链接

允许文件有多个名字。

第4章 操作文件与目录

  • cp:复制文件与目录
  • mv:移动或重命名文件和目录
  • mkdir:创建目录
  • rm:移除文件和目录
  • in:创建硬链接和符号链接

4.1 通配符

通配符

通配符 匹配项
* 匹配任意多个字符(包括0和1个)
匹配任意单个字符(不包括0)
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个不属于字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符

常用字符类

字符类 匹配项
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit] 匹配任意一个数字
[:lower] 匹配任意一个小写字母
[:upper:] 匹配任意一个大写字母

通配符示例

模式 匹配项
* 所有文件
g* 以g开头的所有文件
b*.txt 以b开头的txt文件
Data??? 以Data开头,后面跟3个字符的任一文件
[abc]* 以abc任一开头的任一文件
BACKUP.[0-9][0-9][0-9] BACKUP.开头,后面紧跟3个数字的任一文件
[[:upper:]]* 以大写字母开头的任一文件
[![:digit:]]* 不以数载开头的任一文件
*[[:lower]123] 以小写字母或数字1、2、3中的任一结尾的任一文件

字符范围

[a-z]和[A-Z]尽管还能用,但是难以确保不会发生意想不到的错误

通配符在GUI中也奏效

  • Nautilus:Edit->Select Pattern选择文件。输入通配符表示的文件选择模式,会显示匹配的文件

  • Dolphin和Konqueror:直接地址栏输入通配符,比如在\usr\bin目录下,输入u*,可以显示匹配结果。

4.2 mkdir——创建目录

1
mkdir dir1
1
mkdir dir1 dir2 dir3

4.3 cp——复制文件和目录

复制文件

1
cp item1 item2

复制目录

1
cp item... directory

cp常用选项

选项 含义
-a
—archive
复制文件和目录及其属性,包括所有权和权限。通常来说,复制的文件具有用户操作文件的默认属性
-i
—interactive
在覆盖一个已存在的文件前,提升用户进行确认。如果没有指定该项,cp会默认覆盖文件
-r
—recursive
递归地复制目录及其内容。复制目录时需要使用这个选项(或者-a选项)
-u
—update
当将文件从一个目录复制到另一个目录时,只会复制目标目录中没有的文件或者更新已有的文件
-v
—verbose
复制文件时,显示信息性消息(informative message)

cp命令示例

命令 结果
cp file1 file2 将file1复制到file2。如果file2存在,会被file1覆盖,不存在,会生成file2
cp -i file1 file2 同上,区别是覆盖前会通知用户确认
cp file1 file2 dir1 将file1和file2复制到dir1文件夹下,前提是dir1存在
cp dir/* dir2 将dir1中全部文件复制到dir2中,前提是dir2存在
cp -r dir1 dir2 将dir1目录(及其内容)复制到dir2中,如果dir2不存在,创建dir2

4.4 mv——移除和重命名文件

重命名

1
mv item1 item2

将item移入dir

1
mv item... directory

mv选项

选项 含义
-i
—interactive
覆盖一个已存在的文件之前,提示用户确认。如果没有指定该选项,mv会默认覆盖
-u
—update
把文件从一个目录移动到另一个目录,只移动没有的文件,或更新已有的文件
-v
—verbose
移动文件时显示信息性消息

mv示例

命令 结果
mv file1 file2 file1移动到file2,如果存在file2,会覆盖file2,不存在,会创建file2
mv -i file1 file2 同上,显示确认信息
mv file1 file2 dir 移动file1和file2到dir下,dir必须存在
mv dir1 dir2 将dir1移动到dir2,删除原来位置的dir1,如果dir2不存在,创建dir2

4.5 rm——删除文件和目录

1
rm item...
1
rm *.html

如果不小心多打了一个空格

1
rm * .html

rm 命令将会删除目录中所有文件,并提示说明目录中没有叫做.html的文件。

rm选项

选项 含义
-i
-interactive
删除一个已经存在的文件时,提示用户确认
-r
—recursive
递归删除目录
-f
—force
忽视不存在的文件,无需提示确认,覆盖-i
-v
—verbose
删除文件时显示信息性消息

rm实例

命令 结果
rm file1 在不提示用户的情况下,删除file1
rm -i file1 删除file1前提示用户
rm -r file1 dir1 删除file1、dir1及它们的内容
rm -rf file1 dir1 即使file1和dir1不存在,也会继续删除

4.6 ln——创建链接

创建硬链接

1
ln file link

创建符号链接

1
ln -s item link

4.6.1 硬链接

默认情况下,每一个文件都有一个硬链接,该硬链接会给文件起名字。

当创建一个硬链接时,也会为这个文件创建一个额外的目录条目。

硬链接的局限性:

  • 硬链接不能引用自身系统之外的文件,不在同一磁盘分区的无法引用
  • 硬链接不能够引用目录

硬链接与文件本身无区别,但是包含硬链接的目标列表没有特别的链接指示说明。

当硬链接被删除时,只是删除了链接,文件本身还存在,除非删除文件的全部链接。

4.6.2 符号链接

克服硬链接的局限性。

符号链接通过创建特殊类型的文件起作用,该文件包含了指向引用文件或目录的文本指针。

向符号链接中写入东西,同样会写入引用文件,删除符号链接时,只会删除链接,不会删除文件本身。

坏链接:文件本身先被删除,符号链接仍然存在,不指向任何位置。

ls命令会显示坏链接,标红。

4.7 实战演练

创建目录

1
mkdir playground

image-20230317151028103

1
2
cd playground
mkdir dir1 dir2

image-20230317151130584

复制文件

1
cp /etc/passwd .

image-20230317151228702

查看文件

1
ls -l

image-20230317151305530

重复操作复制命令

1
cp -v /etc/passwd .

image-20230324081055206

加上交互信息

1
cp -i /etc/passwd .

image-20230324081235903

重命名

1
mv passwd fun

image-20230324081553017

移动文件

1
mv fun dir1

image-20230324081700946

1
mv /dir1/fun  dir2

image-20230324081830661

1
mv ~/dir2/fun .

image-20230324081931795


第一部分 学习shell
http://example.com/2023/03/03/第一部分-学习shell/
Author
WYX
Posted on
March 3, 2023
Licensed under