《深度剖析 Linux Shell:从基础概念到高效操作全解》

《深度剖析 Linux Shell:从基础概念到高效操作全解》

导读:围绕 Linux Shell 展开,涵盖从 Shell

的基本概念,如含义、作用,到一系列高效操作,包括命令语法、快捷键使用、历史命令管理等,让初学者清晰知晓文章能深入学习 Shell 相关知识。

2.11.1 Shell的意思 Shell:

蛋壳的意思,是linux中比较重要的一个概念,所有的命令其实都称之为shell命令。看图解:shell就是内核的一个外壳,用户通过shell来控制内核进而驱动硬件做事情,这是它名字的由来。Linux下,没有shell的话,就不能控制这个计算机了,因为内核是用户不能直接控制的。

image-20230707160325144代码语言:javascript复制## 我们使用的是哪个shell呢?

# 在/etc/passwd中就可以看到:

wangwu:x:1002:1002::/home/wangwu:/bin/bash

# 后面这个/bin/bash,就是我们目前使用的shell,后面我们还会更换其他shell来玩,后面再说。

chrony:x:998:996::/var/lib/chrony:/sbin/nologin

# 如果指定的是/sbin/nologin这个shell的话,是没有办法登录系统的

## shell会帮我们检测输入和输出的内容是否正确

# 随便输入点东西,一回车,shell就检测到你这个指令不对,报错给你看

[root@localhost ~]# asdf

-bash: asdf: 未找到命令2.11.2 优化ssh登录速度代码语言:javascript复制## 如果你发现你的xshell或者ssh指令连接linux系统的时候很慢,等好久才连接成功,那么就可以按照下面的方式优化一下,目前我们没有遇到,所以这个暂时就不提了。

#修改配置文件,先备份

[root@localhost ~]# cp /etc/ssh/sshd_config /tmp/

[root@localhost ~]# vi /etc/ssh/sshd_config

#直接输入:79回车

79 GSSAPIAuthentication no

115 UseDNS no

输入:wq保存退出

#重启sshd服务

[root@localhost ~]# systemctl restart sshd

#如果修改失败,还原配置文件

[root@localhost ~]# cp /tmp/sshd_config /etc/ssh/sshd_config

[root@localhost ~]# systemctl restart sshd2.11.3 shell提示符代码语言:javascript复制#root用户提示符

[root@localhost ~]#

#普通用户test1的提示符

[test1@localhost ~]$

#格式:

[用户名@主机名 所在目录]#

# 1、用户名,这个没说啥说的

# 2、主机名:localhost是主机名,windows电脑也有主机名:我的电脑-->属性-->高级系统设置-->计算机名,同一个网络中如果有多台计算机的话,每个计算机都应该有个自己的名字,就是主机名。Linux主机默认叫做localhost,也是可以修改的

[root@localhost ~]# hostname xpcode

[root@localhost ~]# logout

## 退出之后,在重新登录,就看到主机名改好了,如下

[root@xpcode ~]# hostname

xpcode

# 3、所在目录:root登录之后,默认所在目录是/root,此时~表示的/root目录,如果是普通用户登录的,那么~表示的是用户家目录,cd切换目录的时候,显示的当前所在目录

# root用户:

[root@xpcode ~]# pwd

/root

# 普通用户:

[zhangsan@xpcode ~]$ pwd

/home/zhangsan

# 4、提示符号

# 代表当前登录的用户是管理员,$代表的是当前登录用户是普通用户

# 提示符格式定制,这个简单理解一下即可,一般都不改

# 原格式:

[root@test ~]# echo $PS1

[\u@\h \W]\$ # \u是用户,\h是主机名,\W是相对路径

# 临时修改:重新登录就又还原了

[root@test ~]#cd /usr/local/bin/

[root@test bin]#export PS1='[\u@\h \w]\$' # \w表示绝对路径

[root@test /usr/local/bin]#

#永久修改

[root@test 10:23:39 /usr/local/bin]#cd

[root@test 10:24:25 ~]#vi .bashrc

#找个空白的地方,插入一行

export PS1='[\u@\h \t \w]\$'

#linux PS1可以各种定制:参考https://www.cnblogs.com/Q--T/p/5394993.html3-1 临时修改主机名代码语言:javascript复制#临时修改主机名

hostname

例子1:

[root@localhost ~]# hostname test

#需要重新登录生效3-2 查看主机的信息代码语言:javascript复制hostnamectl

#查看主机的信息

[root@localhost ~]# hostnamectl

Static hostname: localhost.localdomain

Icon name: computer-vm

Chassis: vm

Machine ID: f8a89169114741a8ac6de82954c5fbcb

Boot ID: dcf65386ccda42e29699d56101af8cf1

Virtualization: vmware

Operating System: CentOS Linux 7 (Core)

CPE OS Name: cpe:/o:centos:centos:7

Kernel: Linux 3.10.0-1127.el7.x86_64

Architecture: x86-643-3 永久修改主机名代码语言:javascript复制#永久修改主机名

[root@localhost ~]# hostnamectl set-hostname test

#需要重新登录生效3-4 重启系统代码语言:javascript复制#重启系统

reboot

例子1:

[root@test ~]# reboot3-5 关闭或重启Linux代码语言:javascript复制#关闭或者重启linux

shutdown

#立即关机

[root@localhost ~]# shutdown -h now

#5分钟之后关机,可以使用shutdown -c 取消

[root@localhost ~]# shutdown -h 5

#5分钟之后重启系统,可以使用shutdown -c 取2.11.4 shell基础语法4-1 不带参数代码语言:javascript复制## Linux的指令基本都是下面的语法结构,遇到什么指令都不用慌了。

##不带参数的:

## reboot、pwd、id、ls等都可以不接参数,不多4-2 带参数的代码语言:javascript复制## 带参数的:

命令 参数 目标

ls -a -l -h /opt # 参数还可以合并为-alh

rm -rf /opt/test1

命令 源... 目标

mv 源路径 目标路径

cp 4-3 查看命令的参数代码语言:javascript复制# 查看命令的参数: 命令 -h或者--help

[root@test 11:12:02 /opt]#mv --help

用法:mv [选项]... [-T] 源文件 目标文件

或:mv [选项]... 源文件... 目录

或:mv [选项]... -t 目录 源文件...4-4 格式参数代码语言:javascript复制#格式解释

## 格式1:不带参数的命令:

## reboot、pwd、id、ls等都可以不接参数,不多

## 格式2:带参数一个参数的指令:

ls -l

usermod -h 或者 usermod --help

## 格式3:带多个参数的指令:

ls -a -l -h # 参数还可以合并为-alh

## 格式4:带参数带一个目标的指令

ls -l /boot

rm -rf /tmp/xpcode # 注意:千万不要rm -rf /* 这是删除根目录的意思,或者 rm -rf /tmp/*,如果tmp目录不存在,也是删除根目录的意思。

## 格式5:命令带一个目标

cd /tmp/

ls /tmp/

mkdir xpcode

useradd xpcode

...

## 格式6:命令带多个源和目标

cp xpcode.txt /tmp/11.txt # cp 源1 目标1

cp 1.txt 2.txt 3.txt /tmp # cp 源1 源2 源3 目标1

## 格式7:命令带多个参数、多个源和多个目标

ls -a -l -h /tmp /root /opt

cp -a -v /root /root2 # -v是显示拷贝过程的,-a 保留原文件属性的前提下复制文件2.11.5 tab键补全代码语言:javascript复制## 补全命令:

#如果预选的特别多

[root@test 11:25:24 ~]#

Display all 1400 possibilities? (y or n)

#如果预选少

[root@test 11:25:24 ~]#cha

chacl chage chattr

## 补全路径:

#如果预选的特别多

[root@test 11:25:24 ~]#cd /etc/

Display all 188 possibilities? (y or n)

#如果预选少

[root@test 11:25:24 ~]#cd /usr/src/

debug/ kernels/

# 路径不存在的话就说明路径不存在2.11.6 快捷键代码语言:javascript复制Ctrl + a #光标跳转至正在输入的命令行的首部

Ctrl + e #光标跳转至正在输入的命令行的尾部

Ctrl + c #终止前台运行的程序,比如ping指令

Ctrl + d #在shell中,ctrl-d表示推出当前shell。

Ctrl + z #将任务暂停,挂至后台, 执行fg命令继续运行

Ctrl + l #清屏,和clear命令等效。

Ctrl + k #删除从光标到行末的所有字符

Ctrl + u #删除从光标到行首的所有字符

Ctrl + r #搜索历史命令, 利用关键字搜索

ctrl + w #光标往前删除一个参数,以空格为分割。2.11.7 history历史命令代码语言:javascript复制#历史

history

[root@test 14:32:10 ~]#history

1 exit

2 ls

3 head -1 test03.txt

4 head -1 test03.txt|cat

5 head -1 test03.txt|tac

6 head -2 test03.txt|tac

7 head -2 test03.txt|cat

8 ip addr

9 ip addr|tail -4

10 ip addr|tail -4|head -1

......

#使用!调用历史命令

[root@test 14:32:10 ~]#history|head -5

1 exit

2 ls

3 head -1 test03.txt

4 head -1 test03.txt|cat

5 head -1 test03.txt|tac

[root@test 14:32:26 ~]# !3

head -1 test03.txt

head: 无法打开"test03.txt" 读取数据: 没有那个文件或目录

#使用!调用mv开头的命令

[root@test 14:42:17 ~]#history

1 ls -a -l .bash_history

2 history

3 ls

4 history

5 mv aaaaa.txt /tmp/

6 history

[root@test 14:42:19 ~]#!mv # 按回车,会自动找最近一次执行的mv开头的指令

mv aaaaa.txt /tmp/

mv: 无法获取"aaaaa.txt" 的文件状态(stat): 没有那个文件或目录

#清除历史记录

history -c # 这是清除内存中的历史指令

## 删除主文件夹下面.bash_history

# 这是清除硬盘中的历史指令,内存中的指令会自动备份到.bash_history中,但是有个延迟,退出登录之后,才会将历史指令同步到硬盘文件中

##每个用户家目录下都有一个.bash_history,记录的是自己用户的历史指令。

## .bash_history默认记录最近的1000条指令,通过echo $HISTSIZE可以查看,可以配置的更大或者更小一些,vi /etc/profile,这 个以后再说。2.11.8 命令别名(花名)代码语言:javascript复制#别名

alias

# 比如:ls -l 直接可以写ll即可

# 查看别名

[root@test 15:23:17 ~]#alias

alias cp='cp -i'

alias egrep='egrep --color=auto'

alias fgrep='fgrep --color=auto'

alias grep='grep --color=auto'

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias mv='mv -i'

alias rm='rm -i'

# 添加别名

[test1@test 15:24:23 ~]$alias rm='rm -i' # -i是提示警告信息用的

[test1@test 15:27:08 ~]$alias |grep rm

alias rm='rm -i'

或者:[test1@test 15:24:23 ~]$alias rm='echo 禁止使用删除操作'

# 取消别名

[test1@test 15:27:13 ~]$unalias ls

[test1@test 15:27:47 ~]$alias |grep ls

##alias别名的优先级高于系统命令

##别名一定要是可执行的,不能随便定义别名,比如xpcode='aaaaaaa',执行xpcode会报错,没有aaaaaaa这个指令

#alias永久生效

[root@localhost ~]# vi .bashrc

#空白处,增加一行

alias cip='ip addr|tail -4|head -1' 希望这篇文章能够为你在探索 Linux系统的道路上提供有力的帮助,让你在操作 Linux 系统时更加得心应手。 我是**旺仔SeC**,是一名热衷于系统技术的博主,对 Linux系统有着深入的研究和丰富的实践经验。我致力于分享各种系统相关的知识和技巧,帮助大家解决在使用过程中遇到的各种问题。如果你觉得这篇文章对你有所帮助,欢迎点赞、收藏和分享哦

同时,也希望你能关注我的博客,我会持续为大家带来更多优质的系统技术文章,包括但不限于 Linux> 系统的深入探索、系统优化、故障排除以及各种有趣的实战案例。 如果你在学习和使用 Linux

系统的过程中遇到任何问题,或者对某些内容有疑问,欢迎在评论区留言,我会尽力为大家解答。让我们一起在系统技术的海洋中遨游,不断提升自己的技能水平,共同探索系统世界的奥秘

再次感谢大家的阅读,期待我们下次再见!