Shell I 概念与基本命令

Shell

什么是Shell ?

Shell 是一种应用于linux系统的命令行解释器工具的通称。(功能实现层面)

  • 用户向shell 发出命令时
    • 1 如果是内置命令,则直接在当前进程执行内置命令。(内置命令如cd,echo,可以使用type查询)
    • 2如果是非内置命令,则fork() 一个子进程,在子进程中执行用户输入的命令。

Shell 是新用户接入服务器后启动的默认挂起程序。 (应用层面)

  • 应用执行完毕后,会关闭进程。为了使用户可以正常与服务器交互,
    • 需要一个进程在前台挂起,持续等待用户输入命令

Shell 是作用于用户和操作系统内核间的中间程序,为用户提供服务,执行操作系统功能。(系统架构层面)

  • 许多程序需要通过系统调用来实现其功能,而允许用户直接访问内核功能是不安全的。所以通过shell命令来进行系统调用完成系统。

image

Shell 的执行格式

1
2
3
    #               command                                - parameter                 value 

#系统提示符 shell命令或其他可执行程序 选项 传入的参数

独立的命令的安装

1
2
3
4
5
6
7
#  当通过 yum , dnf (centos)或者 apt(ubuntu) 进行命令安装后
# 对应的命令会放置在/user/bin 文件目录下。 shell命令执行时会去该目录下寻找
# 如 [root@iZbp19tqlmjz1dmnm8w43uZ ~]# unzip
# -bash: /usr/bin/unzip: No such file or directory
# 有些程序安装后 并不会直接安装到/user/bin 需要创建软链接 将程序映射到/user/bin 目录
ln -s /user/local/bin/xxx /user/bin/xxx
# 创建链接 指定为软链接 安装目录 链接

基础命令

清空屏幕打印 - clear

  • 只是将输入置于顶端

回显打印 - echo

查看当前工作目录 - pwd

查看返回路径中的文件名 - basename

  • basename [ path ] [ suffix ]
1
2
3
4
[root@iZbp19tqlmjz1dmnm8w43uZ ~]# touch hello.world
[root@iZbp19tqlmjz1dmnm8w43uZ ~]# basename /root/hello.world .world
hello

查询目录下的内容 - ls

1
2
3
4
5
6
-l #以长格式显示文件信息(权限、所有者、组、大小、修改时间等)
-a #显示所有文件,包括隐藏文件(以 . 开头的文件)
-h #与 -l 一起使用,以人类可读的方式显示文件大小(KB、MB、GB)
-t #按修改时间排序(最新的在前)
-r #反向排序
-R #递归地列出子目录中的文件

修改文件权限

linux中 文件的 读,写,执行权限 被设置为了3种 : 所有者,所属用户组,其他用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 当使用ls -l 时,可以看到当前目录下的文件权限描述
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rw-r--r-- 1 root root 7 Mar 28 00:44 hello.txt

# "-" 表示是一个文件 其他类型如 d:目录,l:链接,b:块设备,c:字符设备文件
# rwx 分别代表r 可读 w 可写 x 可执行
# 所以上述 hello.txt 文件 代表 当前文件是一个普通文件,可以被用户所有者读写,所属用户组和其他用户可读
# 使用chmod 来修改用户权限 权限表示为比特置位。当授予所有权限时为 4+2+1 = 7
# 所以 授予所有者执行权限为:
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chmod +100 hello.txt
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwxr--r-- 1 root root 7 Mar 28 00:44 hello.txt
# 授予其他用户读写权限为:
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chmod +006 hello.txt
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwxr--rw- 1 root root 7 Mar 28 00:44 hello.txt
# 去除所属用户组读权限为:
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwx---rw- 1 root root 7 Mar 28 00:44 hello.txt

用户访问权限

在文件的inode中存储了4字节的文件权限内容描述

1
2
        -             
#文件类型(1 字节 -,d,l,b,c) #uid gid sticky(3位) rwx rwx rwx

所以当我们想要访问文件时

  1. 查看当前用户是否具有当前文件的读写执行权限,使用chmod 添加对应的权限(影响最小
  2. 使用chown , chgrp 修改文件所有者 ,所属组 来获得权限
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
40
41
42
43
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwx---rw- 1 root root 7 Mar 28 00:44 hello.txt
# 当前文件 所有者具有读写执行权限,其他用户具有读写权限
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chmod -006 hello.txt
# 清除其他用户权限
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# su cod
# 切换到其他用户,用户无法执行读写
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ cat hello.txt
cat: hello.txt: Permission denied
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ echo hello >hello.txt
bash: hello.txt: Permission denied
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ exit
exit
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chown cod hello.txt
# 切换文件所有这为cod, cod用户得到了读写权限
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# su cod
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ cat hello.txt
你好
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ echo hello > hello.txt
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chmod +070 hello.txt
# 向文件添加所属组的访问权限
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwxrwx--- 1 root root 6 Apr 9 17:45 hello.txt
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chgrp cod hello.txt
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chown root hello.txt
# 修改所属组为cod,所有者为root,使用所属组访问
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwxrwx--- 1 root cod 6 Apr 9 17:45 hello.txt
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# su cod
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ cat hello.txt
hello
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ echo 你好 >hello.txt
[cod@iZbp19tqlmjz1dmnm8w43uZ hello]$ cat hello.txt
你好
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# chmod+7777 hello.txt
# 修改所有置位,可以看到所有者和所属组变为s
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# ls -l
total 4
-rwsrwsrwt 1 root cod 7 Apr 9 18:07 hello.txt

切换目录 - cd

1
2
3
4
5
6
7
8
[root@iZbp19tqlmjz1dmnm8w43uZ codfish]# cd hello/
# 移动到hello目录
[root@iZbp19tqlmjz1dmnm8w43uZ hello]# cd ..
# 返回上级目录
[root@iZbp19tqlmjz1dmnm8w43uZ codfish]# cd ~
# 返回home目录
[root@iZbp19tqlmjz1dmnm8w43uZ ~]#

拷贝文件或目录 - cp

1
2
3
4
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# cp hello hello2
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# ls
hello hello2

创建文件目录 - mkdir

1
2
3
4
5
6
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# mkdir hi
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# mkdir -p one/two
# 递归创建
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# cd one/two/
[root@iZbp19tqlmjz1dmnm8w43uZ two]#

移动文件或目录 - mv

1
2
3
4
5
6
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# ls
hello2 hello
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# mv hello hi
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# ls
hello2 hi

删除文件或目录 - rm

1
2
3
4
5
6
7
8
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# rm hi
rm: remove regular empty file 'hi'? y
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# mkdir hi
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# rm -r hi
rm: remove directory 'hi'? y
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# rm -rf hi
# 递归删除目录及文件

创建空文件 - touch

1
2
3
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# touch file
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# ls
file

查看文件内容

cat 直接查看整个文件的内容

1
2
3
4
5
6
7
8
9
10
11
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# cat file
1
2
3
4
5
6
7
8
9
10

more 交互式查看文件内容

less

head 从头部查看文件

1
2
3
4
5
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# head -n 3 file
1
2
3

tail 从尾部查看文件

1
2
3
4
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# tail -n 3 file
8
9
10

查看文件/目录 实际信息 (inode/block 地址)- stat

1
2
3
4
5
6
7
8
9
10
[root@iZbp19tqlmjz1dmnm8w43uZ cod]# stat file
File: file
Size: 21 Blocks: 8 IO Block: 4096 regular file
Device: fd03h/64771d Inode: 1224103 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-04-09 21:05:51.065782226 +0800
Modify: 2025-04-09 21:05:49.079699125 +0800
Change: 2025-04-09 21:05:49.081699209 +0800
Birth: 2025-04-09 21:05:49.079699125 +0800

查看文件信息 - file

压缩/解压缩 - tar(czf/xzf)


Shell I 概念与基本命令
http://gadoid.io/2025/04/09/Shell-1/
作者
Codfish
发布于
2025年4月9日
许可协议