导读:围绕 Linux Shell 展开,涵盖从 Shell 的基本概念,如含义、作用,到一系列高效操作,包括命令语法、快捷键使用、历史命令管理等,让初学者清晰知晓文章能深入学习 Shell 相关知识。
Shell: 蛋壳的意思,是linux中比较重要的一个概念,所有的命令其实都称之为shell命令。看图解:shell就是内核的一个外壳,用户通过shell来控制内核进而驱动硬件做事情,这是它名字的由来。Linux下,没有shell的话,就不能控制这个计算机了,因为内核是用户不能直接控制的。

## 我们使用的是哪个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: 未找到命令## 如果你发现你的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 sshd#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.html#临时修改主机名
hostname
例子1:
[root@localhost ~]# hostname test
#需要重新登录生效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-64#永久修改主机名
[root@localhost ~]# hostnamectl set-hostname test
#需要重新登录生效#重启系统
reboot
例子1:
[root@test ~]# reboot#关闭或者重启linux
shutdown
#立即关机
[root@localhost ~]# shutdown -h now
#5分钟之后关机,可以使用shutdown -c 取消
[root@localhost ~]# shutdown -h 5
#5分钟之后重启系统,可以使用shutdown -c 取## Linux的指令基本都是下面的语法结构,遇到什么指令都不用慌了。
##不带参数的:
## reboot、pwd、id、ls等都可以不接参数,不多## 带参数的:
命令 参数 目标
ls -a -l -h /opt # 参数还可以合并为-alh
rm -rf /opt/test1
命令 源... 目标
mv 源路径 目标路径
cp # 查看命令的参数: 命令 -h或者--help
[root@test 11:12:02 /opt]#mv --help
用法:mv [选项]... [-T] 源文件 目标文件
或:mv [选项]... 源文件... 目录
或:mv [选项]... -t 目录 源文件...#格式解释
## 格式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 保留原文件属性的前提下复制文件## 补全命令:
#如果预选的特别多
[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/
# 路径不存在的话就说明路径不存在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 #光标往前删除一个参数,以空格为分割。#历史
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,这 个以后再说。#别名
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 系统的过程中遇到任何问题,或者对某些内容有疑问,欢迎在评论区留言,我会尽力为大家解答。让我们一起在系统技术的海洋中遨游,不断提升自己的技能水平,共同探索系统世界的奥秘 再次感谢大家的阅读,期待我们下次再见!