【4.0】Linux之Shell

【一】Shell简介

  • Bash Shell是一个命令解释器,负责用户程序与操作系统内核之间的交互操作。
    • 它作为操作系统的外层接口,接收用户输入的命令并将处理后的结果输出至屏幕。
  • Bash Shell常用于Linux和Unix系统,以文本型的界面形式提供操作环境,没有图形化界面。
    • 远程登录时,通过连接工具打开一个Shell窗口,可以输入命令。
  • 进入和退出Shell:
    • 使用bash命令可以进入Bash Shell。
    • 使用exit命令可以退出Bash Shell。

【二】shell 能干什么

  • 使用Shell可以实现对Linux系统的大部分管理操作,包括但不限于以下内容:
    • 文件管理:创建、移动、复制、删除、编辑文件等。
    • 权限管理:设置不同用户的权限。
    • 用户管理:创建、删除用户等操作。
    • 磁盘管理:挂载磁盘等操作。
    • 网络管理:配置网络参数、查看网络状态等。
    • 软件管理:安装、升级、卸载软件等。
  • 在过去,我们可能使用图形化界面来完成这些操作,而现在可以通过Bash Shell的命令来实现相同的功能。

【三】Shell的使用方式

【1】直接输入命令 - 适用于少量的操作

ls   # 列出当前目录的文件和子目录
pwd  # 打印当前工作目录

直接在Shell窗口输入命令,可以进行一些简单的操作。但当任务较复杂、重复性较高时,效率较低。

【2】Shell脚本 - 适用于复杂重复性的操作

  • 使用Shell脚本可以提高效率,将多个命令封装在一个脚本中,实现复杂或重复性的工作。
  • 例如,在部署Django项目时:
uwsgi -x xx.xml
celery work,beat
  • 以上是两个命令,可以将其写入脚本文件。
vi test.sh   # 创建并编辑test.sh脚本文件
for i in {1..100}
do
echo "create test$i"
done

方式一:

chmod +x test.sh   # 赋予执行权限
./test.sh          # 直接执行脚本

方式二:

bash test.sh      # 通过bash命令执行脚本
  • 使用Shell脚本,我们可以通过编辑脚本文件,将多个命令组织在一起,并实现循环、条件判断等复杂的逻辑操作,从而提高效率。

【四】Shell提示符

【1】解释标识符

  • [root@dream ~]#

    • root: 表示当前登录系统的用户。

    • @:用于分隔用户名和主机名。

    • dream: 表示当前所在的主机或计算机名称

    • ~ :表示当前工作目录的路径。

      • 对于普通用户来说,默认是用户家路径(例如:/home/username)
      • 对于超级用户(root),默认是根路径(/)。
    • # : 表示当前用户是超级用户(root)。

    • $ :表示当前用户是普通用户。

    • 对于普通用户,Shell提示符的结构通常是[username@hostname path]$
    • 对于超级用户(root),结构通常是[username@hostname path]#

【3】主机名

  • 要查看当前主机名,可以使用以下命令:
hostname  # 查看主机名

【4】创建用户

useradd meng  # 在/home 路径下创建一个根用户同名的文件夹--->这个用户家路径

passwd meng   # 给用户设置密码
[root@dream ~]# useradd meng
[root@dream ~]# cd /home
[root@dream home]# ls
admin  meng
[root@dream home]# passwd meng
Changing password for user meng.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@dream home]# 
  • 第一条命令将在/home路径下创建一个名为"dream"的用户文件夹,作为该用户的家路径。
  • 第二条命令用于设置该用户的密码。
  • 请注意,如果您已经以root用户身份登录系统,您可以直接执行命令。
    • su 用户名 # 要不要输入密码,取决于你是谁
  • 如果您是普通用户,需要先通过root用户登录,并使用以下命令切换到目标用户
  • 使用dream登录 ---》final-shell重新使用dream连接
  • root用户连接了,切换成dream用户

【5】查看当前用户

  • 要查看当前登录系统的用户,可以使用以下命令:
whoami

【五】Shell基础语法

【1】格式

  • Shell命令的基本格式如下所示:
# 命令      选项       参数
command [-options] [arguments]
  • 其中

    • 命令指要执行的特定操作,比如ls、cd、mkdir等。

    • 选项可选,可以使用单个字符或者字符组合来修改命令的行为。

    • 参数是命令操作的对象,可以是文件名、目录名、字符串等。

【2】以ls命令为例

  • 以下是使用ls命令的几个示例:
  1. 显示所有文件和目录,包括以.开头的隐藏文件:

    ls -a
    
    [root@dream ~]# ls -a
    .   anaconda-ks.cfg  .bash_profile  .cache   .cshrc  initial-setup-ks.cfg
    ..  .bash_logout     .bashrc        .config  .dbus   .tcshrc
    
  2. 同样地,显示所有文件和目录,使用长格式显示(包含文件的详细信息):

    ls --all
    
    [root@dream ~]# ls --all
    .   anaconda-ks.cfg  .bash_profile  .cache   .cshrc  initial-setup-ks.cfg
    ..  .bash_logout     .bashrc        .config  .dbus   .tcshrc
    
  3. 显示所有文件和目录的详细信息,包括权限、所有者、大小等信息(等同于ls -l):

    ls -al
    
    [root@dream ~]# ls -al
    total 28
    dr-xr-x---.  5 root root  184 Aug 20 19:49 .
    dr-xr-xr-x. 17 root root  224 Aug 20 19:45 ..
    -rw-------.  1 root root 1598 Aug 20 19:46 anaconda-ks.cfg
    -rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
    -rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
    -rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc
    drwx------.  4 root root   31 Aug 20 19:50 .cache
    drwx------.  5 root root   43 Aug 20 19:50 .config
    -rw-r--r--.  1 root root  100 Dec 29  2013 .cshrc
    drwx------.  3 root root   25 Aug 20 19:47 .dbus
    -rw-r--r--.  1 root root 1807 Aug 20 19:49 initial-setup-ks.cfg
    -rw-r--r--.  1 root root  129 Dec 29  2013 .tcshrc
    
  4. 在指定目录/home下,显示所有文件和目录的详细信息:

    ls -al /home
    
    [root@dream ~]# ls -al /home
    total 4
    drwxr-xr-x.  4 root  root    31 Aug 20 21:19 .
    dr-xr-xr-x. 17 root  root   224 Aug 20 19:45 ..
    drwx------. 15 admin admin 4096 Aug 20 19:50 admin
    drwx------.  3 meng  meng    78 Aug 20 21:19 meng
    
  • 在上述示例中,我们演示了使用不同的选项来修改ls命令的行为。
  • 通过添加选项,我们可以控制命令输出的内容或格式。
  • 比如,使用-a选项可以显示隐藏文件,使用-l选项可以显示详细信息。

【六】Shell补全

  • 在Shell中,可以使用Tab键进行命令补全,即当输入部分命令时,按下Tab键会自动补全命令或显示可选项。
    • 如果存在多个选项,按下Tab键会列出所有可能的选项
    • 如果只有一个选项,则会直接补齐。

【1】查看本机IP

  • 要查看本机的IP地址,可以使用以下命令:
ip addr
  • 这将显示本机的网络接口信息,包括IP地址、子网掩码、MAC地址等。
  • 对于Windows系统,可以使用ipconfig命令来查看本机的IP地址。
  • 但是,在某些情况下,无法直接执行ipconfig命令,可能因为缺少第三方软件支持。

【2】解决方法

  • 安装"net-tools"软件包,使用其中的ifconfig命令来查看IP地址。
  • 以下是解决方法的示例:
# 安装"net-tools"软件包
yum install net-tools -y

# 使用"ifconfig"命令查看IP地址
ifconfig

上述示例中,我们通过以下步骤解决了无法使用ifconfig命令的问题:

  1. 安装"net-tools"软件包,其中包含了ifconfig命令。
  2. 执行ifconfig命令来查看本机的IP地址。

【3】DNS解析失败

(1)DNS解析和网卡配置

  • 如果遇到了上网问题,比如DNS解析失败,可以尝试在网络配置中添加另一个DNS服务器地址。
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=80882f46-744b-4d22-ae13-66bfa3b67d37
DEVICE=ens33
ONBOOT=yes
IPADDR=10.0.0.101 # 有时候修改一下这个信息 再加一个DNS就能解决问题了,记得重启网卡
PREFIX=24
GATEWAY=10.0.0.254 # GATEWAY 网关
DNS1=10.0.0.254 # DNS1 和 GATEWAY 一样
DNS2=114.114.114.114  # 新增解析地址
DNS3=223.5.5.5 # 新增解析地址
IPV6_PRIVACY=no
  • 重启网卡服务
systemctl restart network #重启网卡

(2)YUM软件源

  • 还有可能是由于使用了错误的YUM软件源导致无法连接到互联网。
    • 在这种情况下,您可以修改YUM源为阿里云的源
    • 以下是解决方法的示例:

方式一

  • 进入到目标文件夹下
cd /etc/yum.repos.d

方式二

  1. 打开/etc/yum.repos.d目录,使用文本编辑器创建或编辑名为Centos-7.repo的文件。
  2. 在该文件中写入以下内容,保存并关闭文件:
[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aliyun.com/repo/Centos-7.repo
gpgcheck=0

# 可选的其他软件源配置
...

执行以下命令清除YUM缓存和元数据,并重新生成缓存:

yum clean all
yum makecache
  • 以上示例中,我们通过更改YUM源为阿里云的源来解决了YUM无法连接到互联网的问题。
  • 首先,我们创建了一个名为Centos-7.repo的文件,并添加了阿里云的软件源配置。
  • 然后,我们通过清除YUM缓存和重新生成缓存来使新的软件源生效。

【七】shell命令快捷键

  • Ctrl + a #光标跳转至正在输入的命令行的首部
  • Ctrl + e #光标跳转至正在输入的命令行的尾部
  • Ctrl + c #终止前台运行的程序
  • Ctrl + z #将任务暂停,挂至后台
  • Ctrl + l #清屏,和clear命令等效。
  • Ctrl + k #删除从光标到行末的所有字符
  • Ctrl + u #删除从光标到行首的所有字符
  • Ctrl + r #搜索历史命令, 利用关键字,Tab建选中
  • Ctrl + w #按单词或空格进行向前删除
  • Ctrl + 左右建 #按单词或空格进行向前向后跳
  • 在命令行前加面加 "#" 则该命令不会被执行

  • Ctrl + a:

    • 将光标跳转至正在输入的命令行的首部。

    • 这个快捷键可以帮助你快速定位到当前命令行的开头位置。

    • 例如,在命令行中输入一段较长的命令,然后按下Ctrl + a,光标会立即跳转到命令行的开头。

  • Ctrl + e:

    • 将光标跳转至正在输入的命令行的尾部。
    • 与Ctrl + a相反,这个快捷键可以帮助你快速定位到当前命令行的末尾位置。
    • 例如,在命令行中输入一段较长的命令,然后按下Ctrl + e,光标会立即跳转到命令行的末尾。
  • Ctrl + c:

    • 用于终止前台运行的程序。

    • 当你运行一个长时间执行的程序或者命令时,如果想要停止它的执行,可以按下Ctrl + c来终止。

    • 例如,你在命令行中运行了一个无限循环的程序,按下Ctrl + c之后,程序会立即停止。

  • Ctrl + z:

    • 将任务暂停,挂至后台。

    • 这个快捷键可以将当前正在运行的任务暂停,并将其放到后台执行。

    • 使用该快捷键后,你可以继续在命令行中执行其他任务或命令。

    • 例如,你在前台执行了一个需要很长时间才能完成的任务,按下Ctrl + z之后,任务会被暂停,并返回命令行提示符。

  • Ctrl + l:

    • 清屏,和clear命令等效。

    • 按下该快捷键可以清除当前终端窗口的内容,使其变得干净整洁。

    • 这在命令输出很多的情况下特别有用,可以提高可读性。

  • Ctrl + k:

    • 删除从光标到行末的所有字符。

    • 使用该快捷键可以快速删除光标位置到命令行末尾之间的所有字符。

    • 例如,在命令行输入了一段不需要的命令,按下Ctrl + k,会删除掉从光标位置到行末的所有字符。

  • Ctrl + u:

    • 删除从光标到行首的所有字符。
    • 这个快捷键可以帮助你快速删除光标位置到命令行开头之间的所有字符。
    • 例如,你输入了一段错误的命令,但只想重新输入,可以按下Ctrl + u,会删除掉从光标位置到行首的所有字符。
  • Ctrl + r:

    • 搜索历史命令。

    • 按下该快捷键后,你可以通过关键字搜索之前输入过的命令,并使用Tab键进行选择。

    • 例如,按下Ctrl + r之后,输入关键字,然后按下Tab键,会自动选择匹配的历史命令。

  • Ctrl + w:

    • 按单词或空格进行向前删除。

    • 使用该快捷键可以按单词或者空格进行向前删除文本。

    • 例如,在命令行中输入了一段较长的命令,按下Ctrl + w会删除掉最后一个单词或空格。

  • Ctrl + 左右建:

    • 按单词或空格进行向前向后跳。
    • 这个快捷键可以帮助你快速在命令行中按单词或者空格进行向前或向后跳转。
    • 例如,按下Ctrl + 左箭头键会将光标位置向左移动到上一个单词的开头。
  • 另外,在命令行前加面加"#"字符,则该命令不会被执行。
  • 这是一个注释的用法,可以用来解释或者标记某个命令的用途或特殊信息。

【八】命令History

  • history 可以查看命令历史
  • !! 执行上一条命令
  • !数字 执行history历史中第 数字 行的命令
  • !yum 最近一次的yum命令
  • history -d 100 删除第100条历史记录
  • history -c 清空记录(保存到文件中的还有)
  • history -w 保存历史集合,保存到当前用户的家目录 .bash_history
  • .bash_histor 清空文件的保存(操作完,不让别人看你执行的命令)
  • 使用上下键可以快速选择之前执行过的命令
  • history

    • 使用该命令可以查看已执行的命令历史记录。

    • 通过输入"history"命令,系统会列出之前执行过的所有命令,并会显示每个命令对应的编号。

    • 例如,在终端中输入"history",会显示出所有的命令历史记录。

  • 使用上下键

    • 在终端中按上下方向键可以快速选择之前执行过的命令。

    • 这是一个非常方便的方式,可以避免重复输入较长或复杂的命令。

    • 例如,按下向上方向键可以浏览之前执行过的命令,按下向下方向键可以返回到最近的命令。

  • !!

    • 执行上一条命令。

    • 通过输入"!!"命令,系统会自动执行最近一次执行的命令。

    • 例如,如果你刚刚执行了一个很长的命令,并且想要再次执行它,可以直接输入"!!"回车,系统会执行该命令。

  • !数字

    • 执行history历史中第数字行的命令。

    • 通过输入"!数字"命令,可以执行指定行数的历史命令。

    • 例如,输入"!10"将执行历史记录中的第10行命令。

  • !yum

    • 执行最近一次的yum命令。

    • 输入"!yum"命令可以执行最近一次使用yum的命令。

    • 这在安装、升级或删除软件包等操作时非常有用。

    • 例如,如果你最近一次使用yum命令安装了一个软件包,可以直接输入"!yum"回车,系统会再次执行该yum命令。

  • history -d 10

    • 删除第100条历史记录。

    • 通过输入"history -d 100"命令,可以删除指定行数的历史记录。

    • 例如,输入该命令后,系统会删除历史记录中的第100行命令。

  • history -c

    • 清空记录(保存到文件中的还有)。

    • 使用该命令可以清空当前终端的命令历史记录,但是历史记录仍然保存在文件中。

    • 这个命令一般在希望清除某次终端使用记录时使用。

    • 例如,输入"history -c"命令后,当前终端的命令历史记录会被清空。

  • history -w

    • 保存历史记录,保存到当前用户的家目录 .bash_history。

    • 使用该命令可以将当前终端的命令历史记录保存到用户的家目录下的.bash_history文件中,以便下次终端会话时可以继续查看之前的命令历史记录。

    • 例如,输入"history -w"命令后,当前终端的命令历史记录将会保存到.bash_history文件中。

  • .bash_history

    • 清空文件的保存(操作完,不让别人看你执行的命令)。
    • .bash_history文件保存了用户在终端中输入的命令历史记录。
  • 如果希望清除该文件中保存的命令,可以直接清空该文件内容。

echo > .bash_history
  • .bash_history文件中的内容清空。

【九】命令别名

【1】设置别名

  • Alias命令是用于为命令或命令序列创建一个别名,以便在后续使用时可以简化输入。
    • 通过设置别名,我们可以将常用的命令进行简化,提高工作效率。
alias xx='ls -al'
  • 将命令ls -al的别名设置为xx
  • 以后只需输入xx即可执行ls -al命令,达到简化输入的效果。
alias dream='ifconfig'
  • 将命令ifconfig的别名设置为dream
  • 以后只需输入dream即可执行ifconfig命令。

【2】取消别名

  • 当我们不再需要一个别名时,可以使用unalias命令将其取消。

  • 例子中的取消别名的操作是:

    • unalias dream:取消了之前设置的dream别名。

【3】永久生效别名的配置

  • 默认情况下,通过alias命令设置的别名仅在当前会话生效,一旦会话结束,别名就会失效。

    • 要实现永久生效的别名配置,需修改相应的配置文件。
  • 在Linux系统中,可以使用以下两个文件来设置永久生效的别名:

    • /etc/bashrc

      • 这是系统范围的bash配置文件。

      • 通过向该文件中添加别名配置,该别名将对所有用户生效。

      • 例如,执行命令

      echo "alias dream='ls -al'" >> /etc/bashrc
      
      • ls -al命令的别名设置为dream
      • 这样所有用户在打开终端后都可以使用dream来执行ls -al命令。
    • /root/.bashrc

      • 这是针对root用户的bash配置文件。
      • 通过向该文件中添加别名配置,该别名仅对root用户生效。
      • 例如,执行命令
      echo "alias dream='ls -al'" >> /root/.bashrc
      
      • ls -al命令的别名设置为dream
      • 这样只有root用户在打开终端后才能使用dream来执行ls -al命令。
  • 需要注意的是,在修改这些配置文件前,请确保你有足够的权限以及对配置文件的备份。

【十】Shell获取帮助

【1】使用命令的--help选项:

  • 大部分命令都提供了--help选项,通过在命令后加上--help可以获取该命令的简要使用说明和参数信息。
  • 例如,执行ls --help会显示出ls命令的帮助信息,其中包括了该命令的选项、参数以及一些使用示例。

【2】使用man命令:

  • man是manual的缩写,通过man命令可以查看命令的详细手册页。
  • 例如,执行man ls会打开ls命令的手册页,其中包含了关于该命令的详细说明、用法、选项和参数等信息。
  • 在man手册页中,按q键即可退出,使用空格键可以翻页,使用上下箭头键可以在手册页中上下滚动。

【十一】内部/外部命令

  • 在Linux中,我们可以将命令分为内部命令和外部命令两种类型。

【1】内部命令:

  • 内部命令是指Linux系统内置的命令,它们直接运行在Shell的内存中,不需要额外的外部程序支持。
  • 例如,lspwd命令就是内部命令。
    • 我们可以通过使用type命令来查看一个命令是内部还是外部。
  • 执行type -a pwd会显示出pwd是一个内部命令,因为它直接内置于Shell中。

【2】外部命令:

  • 外部命令是指需要依赖于第三方软件或程序的命令,它们需要预先安装在系统中才能使用。
    • 例如,ifconfig命令就是一个外部命令,它属于网络工具包(net-tools)的一部分,需要先安装该工具包才能使用。
    • 如果不确定某个命令是内部还是外部命令,可以使用yum provides命令进行查找。
    • 执行yum provides ifconfig会显示出ifconfig命令属于哪个软件包,从而确定它是一个外部命令。

【3】查看环境变量

  • 此外,我们可以通过查看环境变量来了解Shell是如何查找和执行命令的。

  • 使用echo $PATH命令可查看环境变量PATH的值,它由多个路径组成,用冒号(:)进行分割。

    • 当在Shell中输入一个命令时,Shell会按照PATH环境变量中定义的路径顺序依次搜索命令所在的位置。
  • 大部分外部命令位于/usr/sbin/等目录下,这些目录通常被包含在PATH环境变量中,所以我们在任意路径下输入命令都可以找到对应的执行程序。

【十二】外置命令内存缓存

  • 如果是外置命令还会涉及到一个内存缓存
  • 也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径
  • 在Linux中,对于外部命令,还存在一个内存缓存机制。
    • 当我们多次执行相同的外部命令时,系统会将这个命令的结果保存在内存中,并在后续的执行中直接使用缓存的结果,而不会再次搜索PATH路径。
  • 这个内存缓存的好处是可以提高命令执行的效率,尤其是对于一些耗时较长的外部命令,这种缓存机制能够显著减少命令执行的时间。
  • 例如,假设我们多次执行ifconfig命令来查看网络接口信息。
    • 在首次执行ifconfig时,系统会搜索PATH路径找到并执行相应的外部程序。
    • 然后,系统会将命令的输出结果缓存到内存中。
  • 在后续的执行中,如果再次执行ifconfig命令,系统会直接使用缓存的结果,而不会再搜索PATH路径。
    • 这样就可以避免重复的搜索和执行过程,提高了命令的执行速度。
  • 需要注意的是,如果在缓存期间,相关的配置或网络变化会更新缓存的内容。
    • 所以,在执行需要实时数据或频繁变动的命令时,可能无法从缓存中获取最新的结果,需要考虑清除缓存或使用特定的参数来强制刷新缓存。
  • 总结而言,外部命令在执行过程中会利用内存缓存机制,以提高执行效率。
  • 这种缓存避免了重复搜索PATH路径,直接使用缓存的结果。
  • 但需要注意缓存可能过期或不适用于实时数据的情况。
posted @ 2023-08-22 09:55  Chimengmeng  阅读(40)  评论(0编辑  收藏  举报