当前位置: 首页 > news >正文

Linux基础(十四)——BASH

BASH

  • 1.BASH定义
  • 2.shell的种类
  • 3.bash的功能
    • 3.1 命令记录功能
    • 3.2 命令补全功能
    • 3.3 命令别名设置
    • 3.4 工作控制、 前景背景控制
    • 3.5 程序化脚本: ( shell scripts)
    • 3.6 万用字符
  • 4.bash的内置命令
  • 5.shell的变量功能
    • 5.1 变量的取用
    • 5.2 新建变量
    • 5.3 变量的累加
    • 5.4 变量的导出
    • 5.5 取消自定义变量
    • 5.6 查看变量
    • 5.7 语系变量locale
  • 6.变量的读取
  • 7.ulimit
  • 8.history
  • 9.bash shell的操作环境
    • 9.1 指令顺序
    • 9.2 bash的进站与欢迎讯息: /etc/issue, /etc/motd
  • 10.bash的环境配置文件
    • 10.1 login shell 与 non-login shell
  • 11. 数据流重导向
  • 12.命令执行的判断依据(; && ||)
  • 13. 管线命令(pipe)

1.BASH定义

在 Linux 中,Bash(Bourne Again Shell)是一种 Unix Shell,也是 Linux 系统的默认命令行解释器。Bash 是 GNU 项目开发的自由软件,旨在兼容传统的 Bourne Shell(/bin/sh),同时加入了更多高级功能和增强特性。Bash 提供了一个交互式环境,用户可以在其中执行命令、脚本和管理系统。

硬件、核心与shell的关系:
在这里插入图片描述
内核就是一套软件,为了内核的安全不能直接修改操作内核,所以shell就是内核与应用程序之间的桥梁。

2.shell的种类

shell是有非常多种的,可以查看操作系统的/etc/shells文件:

[root@CentOS7 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

从上面可以看到,CentOS7的shell有好几种,而Linux默认使用的就是bash。
每一个用户所使用的shell是不一样的,相关内容记录在/etc/passwd文件中:

[root@CentOS7 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
fle:x:1000:1000:fle:/home/fle:/bin/bash
ke:x:1001:1002::/home/ke:/bin/bash
zhangsan:x:1002:1003::/home/zhangsan:/bin/bash
lisi:x:1003:1004::/home/lisi:/bin/bash
ZhangSan_U:x:1004:1004::/home/ZhangSan_U:/bin/bash

如上面,每一行最后面的就是使用者的shell,如root的shell为/bin/bash,bin的shell为/sbin/nologin。

3.bash的功能

3.1 命令记录功能

在命令行环境下,可以通过上下箭头来快速编写指令,这是bash的一个特性,也肯定是因为bash有一个文件记录了过去执行过的命令。这个文件就是主文件夹内的.bash_history

[root@CentOS7 ~]# ls -a
.                .bash_logout   .config               .local    .xauth3eFPL9
..               .bash_profile  .cshrc                .pki      .xauthhN2LLj
anaconda-ks.cfg  .bashrc        .dbus                 .tcshrc   .xauthxomduP
.bash_history    .cache         initial-setup-ks.cfg  .viminfo

不过, 需要留意的是,~/.bash_history 记录的是前一次登陆以前所执行过的指令, 而至于这一次登陆所执行的指令都被暂存在内存中, 当你成功的登出系统后, 该指令记忆才会记录到 .bash_history 当中。

3.2 命令补全功能

就是Tab键了。

3.3 命令别名设置

可以通过alias来设置命令的别名:

[root@CentOS7 ~]# 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'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@CentOS7 ~]# alias lm='ls -al'
[root@CentOS7 ~]# ls -al
总用量 56
dr-xr-x---.  7 root root 4096 11月  9 19:47 .
dr-xr-xr-x. 18 root root  256 11月  8 15:01 ..
-rw-------.  1 root root 2585 5月  18 21:04 anaconda-ks.cfg
-rw-------   1 root root 3302 11月  9 16:48 .bash_history
-rw-r--r--.  1 root root   18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root  176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root  176 12月 29 2013 .bashrc
drwx------.  4 root root   31 9月  28 20:15 .cache
drwxr-xr-x   3 root root   18 9月  28 20:15 .config
-rw-r--r--.  1 root root  100 12月 29 2013 .cshrc
drwx------.  3 root root   25 5月  18 21:15 .dbus
-rw-r--r--.  1 root root 2633 5月  18 21:15 initial-setup-ks.cfg
drwxr-xr-x   3 root root   19 9月  28 20:15 .local
drwxr-----   3 root root   19 9月  28 20:44 .pki
-rw-r--r--.  1 root root  129 12月 29 2013 .tcshrc
-rw-------   1 root root 4844 11月  9 19:47 .viminfo
-rw-------   1 root root  104 11月  9 16:49 .xauth3eFPL9
-rw-------   1 root root  104 11月  7 10:27 .xauthhN2LLj
-rw-------   1 root root  104 10月 23 18:23 .xauthxomduP
[root@CentOS7 ~]# lm
总用量 56
dr-xr-x---.  7 root root 4096 11月  9 19:47 .
dr-xr-xr-x. 18 root root  256 11月  8 15:01 ..
-rw-------.  1 root root 2585 5月  18 21:04 anaconda-ks.cfg
-rw-------   1 root root 3302 11月  9 16:48 .bash_history
-rw-r--r--.  1 root root   18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root  176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root  176 12月 29 2013 .bashrc
drwx------.  4 root root   31 9月  28 20:15 .cache
drwxr-xr-x   3 root root   18 9月  28 20:15 .config
-rw-r--r--.  1 root root  100 12月 29 2013 .cshrc
drwx------.  3 root root   25 5月  18 21:15 .dbus
-rw-r--r--.  1 root root 2633 5月  18 21:15 initial-setup-ks.cfg
drwxr-xr-x   3 root root   19 9月  28 20:15 .local
drwxr-----   3 root root   19 9月  28 20:44 .pki
-rw-r--r--.  1 root root  129 12月 29 2013 .tcshrc
-rw-------   1 root root 4844 11月  9 19:47 .viminfo
-rw-------   1 root root  104 11月  9 16:49 .xauth3eFPL9
-rw-------   1 root root  104 11月  7 10:27 .xauthhN2LLj
-rw-------   1 root root  104 10月 23 18:23 .xauthxomduP

可以通过alias来查询已有的命令别名,也可以通过alias XX=''来设置新的命令别名。
Tips:可以用unalias来取消别名设置。

3.4 工作控制、 前景背景控制

使用前、 背景的控制可以让工作进行的更为顺利! 至于工作控制( jobs) 的用途则更广, 可以让我们随时将工作丢到背景中执行! 而不怕不小心使用了 [Ctrl] + c 来停掉该程序! 真是好样的! 此外, 也可以在单一登陆的环境中, 达到多任务的目的呢.

3.5 程序化脚本: ( shell scripts)

在 DOS 年代还记得将一堆指令写在一起的所谓的“批处理文件”吧? 在 Linux 下面的 shellscripts 则发挥更为强大的功能, 可以将你平时管理系统常需要下达的连续指令写成一个文件, 该文件并且可以通过对谈互动式的方式来进行主机的侦测工作! 也可以借由 shell 提供的环境变量及相关指令来进行设计.

3.6 万用字符

除了完整的字串之外, bash 还支持许多的万用字符来帮助使用者查询与指令下达,如rm -rf /tmp/*中的*就是一个万用字符。
在这里插入图片描述

[dmtsai@study ~]$ LANG=C              <==由於與編碼有關,先設定語系一下範例一:找出 /etc/ 底下以 cron 為開頭的檔名
[dmtsai@study ~]$ ll -d /etc/cron*    <==加上 -d 是為了僅顯示目錄而已範例二:找出 /etc/ 底下檔名『剛好是五個字母』的檔名
[dmtsai@study ~]$ ll -d /etc/?????    <==由於 ? 一定有一個,所以五個 ? 就對了範例三:找出 /etc/ 底下檔名含有數字的檔名
[dmtsai@study ~]$ ll -d /etc/*[0-9]*  <==記得中括號左右兩邊均需 *範例四:找出 /etc/ 底下,檔名開頭非為小寫字母的檔名:
[dmtsai@study ~]$ ll -d /etc/[^a-z]*  <==注意中括號左邊沒有 *範例五:將範例四找到的檔案複製到 /tmp/upper 中
[dmtsai@study ~]$ mkdir /tmp/upper; cp -a /etc/[^a-z]* /tmp/upper

4.bash的内置命令

在 Bash 中,内置命令和非内置命令的区别主要体现在命令的来源、执行效率和资源消耗上:
1.内置命令
内置命令是 Bash 自身集成的命令,即直接由 Bash 解释器提供和执行的命令。这些命令不需要调用外部程序,执行速度较快,且不产生额外的进程。它们通常用于管理 Shell 环境或提供基本的系统控制功能。例如:
cd:改变当前目录。
echo:输出字符串。
export:设置环境变量。
alias:创建命令别名。
执行效率高的原因是内置命令在 Bash 中直接处理,无需启动新进程,因此适合频繁使用和进行环境设置。

2.非内置命令
非内置命令(或称外部命令)是由系统中可执行的外部程序提供的命令。当执行非内置命令时,Bash 会在系统的 PATH 目录中查找相应的程序,启动一个新进程执行该命令。例如:
ls:列出目录内容。
grep:查找文件中的匹配文本。
cat:连接文件并显示内容。
非内置命令通常位于 /bin、/usr/bin 等目录中。由于执行非内置命令需要创建新进程,因此效率较内置命令稍低,适合执行较复杂的任务。

如何查询某一个命令是否为内置命令:
在这里插入图片描述

[root@CentOS7 ~]# type cd
cd 是 shell 内嵌
[root@CentOS7 ~]# type ls
ls 是 `ls --color=auto' 的别名

5.shell的变量功能

各种shell都是有变量功能的,bash也不例外。

5.1 变量的取用

有两种取用方式——echo ${变量名}echo $变量名.

[root@CentOS7 ~]# echo ${PATH}
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@CentOS7 ~]# echo ${MAIL}
/var/spool/mail/root

5.2 新建变量

使用=来新建变量:

[root@CentOS7 ~]# myname='Fle'
[root@CentOS7 ~]# echo ${myname}
Fle

5.3 变量的累加

[root@CentOS7 ~]# myname='Fle'
[root@CentOS7 ~]# echo ${myname}
Fle
[root@CentOS7 ~]# myname=${myname}:master
[root@CentOS7 ~]# echo ${myname}
Fle:master

5.4 变量的导出

在目前这个 shell 的情况下, 去启用另一个新的 shell , 新的那个 shell 就是子程序啦! 在一般的状态下, 父程序的自订变量是无法在子程序内使用的。 但是通过 export 将变量变成环境变量后, 就能够在子程序下面应用了。

[root@CentOS7 ~]# myname='Fle'
[root@CentOS7 ~]# echo ${myname}
Fle
[root@CentOS7 ~]# bash
[root@CentOS7 ~]# echo ${myname}[root@CentOS7 ~]#

我们可以用bash命令来开启一个新的shell子程序,则自定义的变量myname已经失效了。
下面使用export:

[root@CentOS7 ~]# myname='Fle'
[root@CentOS7 ~]# echo ${myname}
Fle
[root@CentOS7 ~]# export myname
[root@CentOS7 ~]# bash
[root@CentOS7 ~]# echo ${myname}
Fle
[root@CentOS7 ~]# 

取消变量的导出用:declare

5.5 取消自定义变量

[root@CentOS7 ~]# myname='Fle'
[root@CentOS7 ~]# echo ${myname}
Fle
[root@CentOS7 ~]# unset myname
[root@CentOS7 ~]# echo ${myname}[root@CentOS7 ~]# 

5.6 查看变量

用env可以观察环境变量:

[root@CentOS7 ~]# env
XDG_VTNR=1
XDG_SESSION_ID=1
HOSTNAME=CentOS7
SHELL=/bin/bash
TERM=xterm-256color
HISTSIZE=1000
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;...
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
KDEDIRS=/usr
HISTCONTROL=ignoredups
SHLVL=3
XDG_SEAT=seat0
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=:0
QT_PLUGIN_PATH=/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins
XAUTHORITY=/root/.xauth3eFPL9
_=/bin/env

从上面就可以看出,SHELL=/bin/bash表示使用的是/bin/bash这个shell。PATH就是环境变量,PWD就是当前目录,HOME就是家目录。

用set可以查看所有的变量(环境变量与自定义变量):
在这里插入图片描述
一般来说, 不论是否为环境变量, 只要跟我们目前这个 shell 的操作接口有关的变量, 通常都会被设置为大写字符, 也就是说, “基本上, 在 Linux 默认的情况中, 使用{大写的字母}来设置的变量一般为系统内定需要的变量.
比较重要的变量:
①PS1: ( 提示字符的设置)
在这里插入图片描述
观察默认的提示字符:[root@CentOS7 ~]# ,也就是[\u@\h \W]。我们可以修改,比如加上一个时间:

[root@CentOS7 ~]# PS1='[\u@\h \d \W]'
[root@CentOS7 一 11月 11 ~]ls
anaconda-ks.cfg  initial-setup-ks.cfg

②$
钱字号本身也是个变量喔! 这个咚咚代表的是“目前这个 Shell 的线程代号”, 亦即是所谓的PID ( Process ID)

[root@CentOS7 ~]echo ${$}
81019
[root@CentOS7 ~]bash
[root@CentOS7 ~]# echo ${$}
82198

③?
问号也是一个特殊的变量? 没错! 在 bash 里面这个变量可重要的很! 这个变量是: “上一个执行的指令所回传的值”, 上面这句话的重点是“上一个指令”与“回传值”两个地方。 当我们执行某些指令时, 这些指令都会回传一个执行后的代码。 一般来说, 如果成功的执行该指令, 则会回传一个 0 值, 如果执行过程发生错误, 就会回传“错误代码”。

[root@CentOS7 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg
[root@CentOS7 ~]# echo ${?}
0
[root@CentOS7 ~]# touch ./fle/file
touch: 无法创建"./fle/file": 没有那个文件或目录
[root@CentOS7 ~]# echo ${?}
1

④OSTYPE, HOSTTYPE, MACHTYPE
1.OSTYPE
OSTYPE 表示操作系统的类型。这个变量包含了当前操作系统的名称和版本,通常包括系统类型的简写。例如:
linux-gnu:表示 GNU/Linux 系统。
darwin:表示 macOS 系统。
cygwin:表示 Cygwin 环境(Windows 下的 UNIX 仿真层)。
该变量让脚本根据操作系统进行特定处理,如区分 Linux 和 macOS 的文件路径格式。

2.HOSTTYPE
HOSTTYPE 表示主机的处理器架构类型。这个变量的值包含硬件架构的简写,帮助识别运行环境的硬件平台。例如:
x86_64:表示 64 位 x86 架构(大多数现代 PC)。
i686:表示 32 位 x86 架构。
arm:表示 ARM 架构,常见于移动设备和一些嵌入式系统。
这个变量通常用于调整编译选项或在不同的硬件平台上执行特定操作。

3.MACHTYPE
MACHTYPE 表示系统的完整平台类型,结合了操作系统和处理器架构。它的格式通常为 --,例如:
x86_64-pc-linux-gnu:表示 64 位 PC 的 GNU/Linux 系统。
arm-apple-darwin:表示基于 ARM 的 macOS 系统(如 M1 芯片)。
MACHTYPE 提供了更详细的系统信息,在编译多平台软件或执行系统特定的配置时非常有用。

5.7 语系变量locale

用locale查看支持的语系:

[root@CentOS7 ~]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

6.变量的读取

要读取来自键盘输入的变量, 就是用 read 这个指令了。 这个指令最常被用在 shell script 的撰写当中, 想要跟使用者对谈?用这个指令就对了。
在这里插入图片描述

[root@CentOS7 ~]# read -p "Please input your name:" myname
Please input your name:Fle
[root@CentOS7 ~]# echo ${myname}
Fle

7.ulimit

想像一个状况: 我的 Linux 主机里面同时登陆了十个人, 这十个人不知怎么搞的, 同时打开了 100 个文件, 每个文件的大小约 10MBytes , 请问一下, 我的 Linux 主机的内存要有多大才够? 1010010 = 10000 MBytes = 10GBytes … 老天爷, 这样, 系统不挂点才有鬼哩! 为了要预防这个情况的发生, 所以我们的 bash 是可以“限制使用者的某些系统资源”的, 包括可以打开的文件数量, 可以使用的 CPU 时间, 可以使用的内存总量等等。 如何设置? 用 ulimit吧!
在这里插入图片描述

8.history

history可以用来查看之前执行过的命令:
在这里插入图片描述

[root@CentOS7 ~]read -p "Please input your name:" myname
Please input your name:Fle
[root@CentOS7 ~]echo ${myname}
Fle
[root@CentOS7 ~]history 3274  read -p "Please input your name:" myname275  echo ${myname}276  history 3
[root@CentOS7 ~]exit
exit
[root@CentOS7 ~]# tail -n 5 ~/.bash_history 
tail -n 10 ~/.bash_history 
read -p "Please input your name:" myname
echo ${myname}
history 3
exit

可以看到执行过的命令,同时也可以查看~/.bash_history文件,但要注意离开bash才会把东西写入/.bash_history文件,所以用了一个exit命令。

9.bash shell的操作环境

是否记得我们登陆主机的时候, 屏幕上头会有一些说明文字, 告知我们的 Linux 版本啊什么的, 还有, 登陆的时候我们还可以给予使用者一些讯息或者欢迎文字呢。 此外, 我们习惯的环境变量、 命令别名等等的, 是否可以登陆就主动的帮我设置好? 这些都是需要注意的。 另外, 这些设置值又可以分为系统整体设置值与各人喜好设置值, 仅是一些文件放置的地点不同。
在这里插入图片描述

9.1 指令顺序

现在我们知道系统里面其实有不少的 ls 指令, 或者是包括内置的echo 指令, 那么来想一想, 如果一个指令 ( 例如 ls) 被下达时, 到底是哪一个 ls 被拿来运行? 很有趣吧! 基本上, 指令运行的顺序可以这样看:

  1. 以相对/绝对路径执行指令, 例如“ /bin/ls ”或“ ./ls ”;
  2. 由 alias 找到该指令来执行;
  3. 由 bash 内置的 ( builtin) 指令来执行;
  4. 通过 $PATH 这个变量的顺序搜寻到的第一个指令来执行

9.2 bash的进站与欢迎讯息: /etc/issue, /etc/motd

[fle@CentOS7 ~]$ cat /etc/issue
\S
Kernel \r on an \m[fle@CentOS7 ~]$ 

里面默认有三行, 较有趣的地方在于 \r 与\m。 就如同 $PS1 这变量一样, issue 这个文件的内容也是可以使用反斜线作为变量取用喔! 你可以 man issue 配合 man agetty 得到下面的结果:
在这里插入图片描述
Tips:除了 /etc/issue 之外还有个 /etc/issue.net 呢! 这是啥? 这个是提供给 telnet这个远端登陆程序用的。 当我们使用 telnet 连接到主机时, 主机的登陆画面就会显示/etc/issue.net 而不是 /etc/issue 呢.

至于如果您想要让使用者登陆后取得一些讯息, 例如您想要让大家都知道的讯息, 那么可以将讯息加入 /etc/motd 里面去! 例如: 当登陆后, 告诉登陆者, 系统将会在某个固定时间进行维护工作, 可以这样做 ( 一定要用 root 的身份才能修改喔! ) :
在这里插入图片描述

10.bash的环境配置文件

你是否会觉得奇怪, 怎么我们什么动作都没有进行, 但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境设置文件的存在, 让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作环境啦! 而这些配置文件又可以分为全体系统的配置文件以及使用者个人偏好配置文件。 要注意的是, 我们前几个小节谈到的命令别名啦、 自订的变量啦, 在你
登出 bash 后就会失效, 所以你想要保留你的设置, 就得要将这些设置写入配置文件才行。

10.1 login shell 与 non-login shell

在 Linux 中,login shell(登录 Shell)和 non-login shell(非登录 Shell)有一些关键区别,主要体现在启动时加载的配置文件和启动方式上。

1.登录方式和环境变量的加载
Login Shell:这是用户首次登录系统时启动的 Shell,例如通过终端登录或使用 ssh 连接到远程主机。在 login shell 中,Shell 会首先加载全局和用户级别的配置文件,包括:
/etc/profile
全局的配置文件,所有用户共享。这个配置文件可以利用使用者的识别码( UID) 来决定很多重要的变量数据, 这也是每个使用者登陆取得 bash 时一定会读取的配置文件! 所以如果你想要帮所有使用者设置整体环境, 那就是改这里。
这个文件设置的变量主要有:
在这里插入图片描述
/etc/profile还会去调用外部的数据:
a. /etc/profile.d/*.sh
其实这是个目录内的众多文件! 只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh , 另外, 使用者能够具有 r 的权限, 那么该文件就会被 /etc/profile 调用进来。 在 CentOS 7.x 中, 这个目录下面的文件规范了 bash 操作接口的颜色、 语系、 ll 与 ls 指令的命令别名、 vi 的命令别名、 which 的命令别名等等。 如果你需要帮所有使用者设置一些共享的命令别名时, 可以在
这个目录下面自行创建扩展名为 .sh 的文件, 并将所需要的数据写入即可.
b. /etc/locale.conf
这个文件是由 /etc/profile.d/lang.sh 调用进来的! 这也是我们决定 bash 默认使用何种语系的重要配置文件
c. /usr/share/bash-completion/completions/*
记得我们上头谈过 [tab] 的妙用吧? 除了命令补齐、 文件名补齐之外, 还可以进行指令的选项/参数补齐功能
~/.bash_profile、~/.bash_login 或 ~/.profile
用户的个人配置文件,顺序读取第一个存在的文件。看一下具体例子:

[fle@CentOS7 ~]$ ls -a ~/.bash_*
/home/fle/.bash_history  /home/fle/.bash_logout  /home/fle/.bash_profile
[fle@CentOS7 ~]$ cat /home/fle/.bash_profile
# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi# User specific environment and startup programsPATH=$PATH:$HOME/.local/bin:$HOME/binexport PATH

可以看到,fle用户只有.bash_profile文件,其内容包括两个方面:读取.~/.bashrc(所以其实.bash_profile是会调用/.bashrc的内容的);用累加的方式加入`$HOME/.local/bin:$HOME/bin`到环境变量PATH。(这意味着:增加使用者主文件夹下的/bin/ 为额外的可执行文件放置目录。 这也就是说, 你可以将自己创建的可执行文件放置到你自己主文件夹下的 ~/bin/ 目录啦! 那就可以直接执行该可执行文件而不需要使用绝对/相对路径来执行该文件)
Tips:利用 source 或小数点 (.) 都可以将配置文件的内容读进来目前的 shell 环境中
所以login shell开启bash的过程可以总结如下:
在这里插入图片描述

Non-login Shell:这是在登录后启动的子 Shell,例如通过在终端中直接运行 bash 或在终端模拟器中打开一个新窗口。non-login shell 通常加载的是:
~/.bashrc:非登录 Shell 使用的配置文件。

[fle@CentOS7 ~]$ cat ~/.bashrc
# .bashrc# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=# User specific aliases and functions

可以发现其调用了/etc/bashrc文件,因为 /etc/bashrc 帮我们的 bash 定义出下面的数据:
在这里插入图片描述

2.典型用法
Login Shell:适用于系统初始登录的环境配置,一般会在登录后设置全局环境变量或 PATH 路径。
Non-login Shell:常用于启动新终端窗口或执行单个 Shell 命令的场景。它适合命令行中的简化操作,不需要进行环境变量的重复加载。

11. 数据流重导向

在 Linux 中,数据流重定向(I/O 重定向)是指将命令的输入、输出或错误流定向到特定位置,例如文件、设备或其他命令。它主要包括标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的重定向。
在这里插入图片描述
基本重定向类型:
①标准输出重定向:将输出重定向到文件。
覆盖输出:command > file。例如,echo "Hello" > output.txt 会将 Hello 写入 output.txt 文件(覆盖原有内容)。
追加输出:command >> file。例如,echo "Hello" >> output.txt 会将 Hello 追加到 output.txt 的末尾。
②标准输入重定向:从文件读取输入。
command < file:例如,wc -l < file.txt 将 file.txt 的内容传递给 wc -l 命令作为输入。
③标准错误重定向:将错误输出重定向到文件。
覆盖输出:command 2> file。例如,ls non_existent_file 2> error.txt 会将错误信息写入 error.txt 文件。
追加错误输出:command 2>> file 会将错误追加到文件末尾。
④标准输出和标准错误同时重定向
command > file 2>&1:将标准输出和标准错误都重定向到同一文件。
command &> file:简化写法,适用于一些 Shell,将标准输出和标准错误都重定向到 file。

双向重定向:tee
想个简单的东西, 我们知道 > 会将数据流整个传送给文件或设备, 因此我们除非去读取该文件或设备, 否则就无法继续利用这个数据流。 万一我想要将这个数据流的处理过程中将某段讯息存下来, 应该怎么做? 利用 tee 就可以。
在这里插入图片描述
在这里插入图片描述

[root@CentOS7 ~]# touch /tmp/file1 /tmp/file2
[root@CentOS7 ~]# ls /tmp | tee /tmp/list
file1
file2
[root@CentOS7 ~]# cat /tmp/list
file1
file2

这样就可以同时将数据传送到屏幕和文件list。

12.命令执行的判断依据(; && ||)

①;

[fle@CentOS7 ~]$ ls /tmp
[fle@CentOS7 ~]$ ls /tmp/
[fle@CentOS7 ~]$ mkdir /tmp/fle;touch /tmp/fle/file
[fle@CentOS7 ~]$ ls /tmp
fle
[fle@CentOS7 ~]$ rm -rf /tmp/*
[fle@CentOS7 ~]$ mkdir touch /tmp/fle/file;mkdir /tmp/fle
mkdir: 无法创建目录"/tmp/fle/file": 没有那个文件或目录

可以看到,;是按顺序来执行的。
②&&和||
在这里插入图片描述
举一个例子,目标为判断/tmp/fle文件夹是否存在,若存在则在这个文件夹下创建file文件,若不存在,则在/tmp文件夹下创建file文件:

[fle@CentOS7 ~]$ rm -rf /tmp/*
[fle@CentOS7 ~]$ touch /tmp/fle/file || touch /tmp/file
touch: 无法创建"/tmp/fle/file": 没有那个文件或目录
[fle@CentOS7 ~]$ ls /tmp
file

13. 管线命令(pipe)

bash 命令执行的时候有输出的数据会出现! 那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式, 应该如何来设置? 这就牵涉到管线命令的问题了 ( pipe) , 管线命令使用的是“ | ”这个界定符号。

其实这个管线命令“ | ”仅能处理经由前面一个指令传来的正确信息, 也就是 standard output 的信息, 对于 stdandard error 并没有直接处理的能力:
在这里插入图片描述
在每个管线后面接的第一个数据必定是“指令”喔! 而且这个指令必须要能够接受 standard input 的数据才行, 这样的指令才可以是为“管线命令”, 例如 less, more, head, tail 等都是可以接受 standard input 的管线命令啦。 至于例如 ls, cp, mv 等就不是管线命令了! 因为 ls, cp,mv 并不会接受来自 stdin 的数据。

[fle@CentOS7 ~]$ ps aux | grep 'python'
root       1243  0.0  0.1 574284  1088 ?        Ssl  14:07   0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
fle        4133  0.0  0.0 112828   980 pts/0    S+   15:43   0:00 grep --color=auto python

ps aux:列出当前系统中所有的进程,包括详细的进程信息。
|(管道):将前一个命令的输出传递给后一个命令。
grep ‘python’:从 ps aux 命令的输出中筛选出包含 “python” 字符串的行。
这条命令的作用是查找当前运行的所有 Python 进程。管道使得 grep 只处理 ps aux 输出的进程信息,而无需临时保存或修改文件。
下面是一些常用的可以和管线搭配使用的命令:
①cut
截取某一段信息。
在这里插入图片描述

[root@CentOS7 ~]# echo ${PATH}
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@CentOS7 ~]# echo ${PATH} | cut -d ':' -f 2
/usr/local/sbin

②grep
搜索特定字符串。
在这里插入图片描述
③sort
用于排序。

在这里插入图片描述
④uniq
如果我排序完成了, 想要将重复的数据仅列出一个显示。
在这里插入图片描述
⑤wc
如果我想要知道 /etc/man_db.conf 这个文件里面有多少字? 多少行? 多少字符的话, 可以怎么做呢? 其实可以利用 wc 这个指令来达成。
在这里插入图片描述
查看使用者个数:

[root@CentOS7 ~]# wc -l /etc/passwd
67 /etc/passwd

⑥xargs
xargs 是一个非常有用的 Linux 命令,用于将标准输入的数据转换为命令行参数并传递给其他命令。它可以通过管道 (|) 从其他命令中接收输出,并将其作为参数传递给指定的命令。
在这里插入图片描述

[root@CentOS7 ~]# cd /tmp;touch file1 file2 file3
[root@CentOS7 tmp]# echo "file1 file2 file3" | xargs rm
[root@CentOS7 tmp]# ls
list

相关文章:

Linux基础(十四)——BASH

BASH 1.BASH定义2.shell的种类3.bash的功能3.1 命令记录功能3.2 命令补全功能3.3 命令别名设置3.4 工作控制、 前景背景控制3.5 程序化脚本&#xff1a; &#xff08; shell scripts&#xff09;3.6 万用字符 4.bash的内置命令5.shell的变量功能5.1 变量的取用5.2 新建变量5.3 …...

架构师备考-概念背诵(系统架构)

软件架构概念 一个程序和计算系统软件体系结构是指系统的一个或者多个结构。结构中包括软件的构件,构件的外部可见属性以及它们之间的相互关系。体系结构并非可运行软件。确切地说,它是一种表达,使软件工程师能够: (1)分析设计在满足所规定的需求方面的有效性:(2)在设计变…...

如何让ffmpeg运行时从当前目录加载库,而不是从/lib64

程序在linux下运行时&#xff0c;一般从 /lib64 目录下加载依赖的库文件&#xff0c;如xxx.so. 有时候&#xff0c;系统里没有这些库&#xff0c;也不想从系统目录下加载&#xff0c;怎么办呢&#xff1f; 看下面的调整过程。 使用的源代码是 ffmpeg-6.1.tar.xz 解压后&…...

Kafka-Controller选举

一、上下文 《Kafka-broker粗粒度启动流程》博客中我们分析了broker的大致启动流程&#xff0c;这个时候每个broker都不是controller角色&#xff0c;下面我们就来看下它是如何选举出来的吧 二、设置ZooKeeper ‌ZooKeeper是一个开源的分布式协调服务&#xff0c;主要用于分…...

必知的 Vue3 组件传值技巧:解锁组件交互新姿势

父传子defineProps 基本概念 在 Vue 3 中&#xff0c;父传子是一种组件间通信的方式&#xff0c;用于将父组件的数据传递给子组件。这种通信方式可以让组件之间更好地协作&#xff0c;实现功能的复用和模块的划分。 实现步骤 在父组件中传递数据 App.vue <template>…...

【论文阅读】医学SAM适配器:适应医学图像分割的任意分割模型

【论文阅读】医学SAM适配器&#xff1a;适应医学图像分割的任意分割模型 文章目录 【论文阅读】医学SAM适配器&#xff1a;适应医学图像分割的任意分割模型一、介绍二、联系工作三、方法四、实验 Medical SAM Adapter: Adapting Segment Anything Model for Medical Image Segm…...

创新体验触手可及 紫光展锐携手影目科技推出AI眼镜开放平台

近日&#xff0c;紫光展锐携手影目科技共同发布了搭载展锐W517芯片的影目X系列AI眼镜开放平台。这一产品的推出标志着双方在智能穿戴领域的深度协作&#xff0c;将紫光展锐的领先芯片技术与影目的产品创新相融合&#xff0c;合力打造全球智能眼镜市场的标杆产品。这一战略布局不…...

115页PDF | 埃森哲_XX集团信息化能力成熟度评估及能力提升方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息化能力成熟度评估及能力提升方案&#xff0c;报告首先分析了集团的战略规划&#xff0c;包括调整优化期、转型升级期和跨越发展期的目标&#xff0c;然后识别了集团面临的内部挑战和外部压力&#xff0c;如管控体系不完善、业务板块多样化…...

NumPy,科学计算领域中的Python明星库!

NumPy&#xff0c;科学计算领域中的Python明星库&#xff01; 嘿&#xff0c;大家好呀&#xff0c;今天我们要来聊聊在科学计算领域里大放异彩的 NumPy 库。NumPy 是 Python 中的一个开源库&#xff0c;它提供了大量的数学函数&#xff0c;能够高效地处理大型数组与矩阵运算。…...

Hadoop生态圈框架部署(六)- HBase完全分布式部署

文章目录 前言一、Hbase完全分布式部署&#xff08;手动部署&#xff09;1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.j…...

python怎么解决中文注释

最近开发学习Python&#xff0c;当加入中文注释时&#xff0c;运行程序报错&#xff1a; File "red.py", line 10 SyntaxError: Non-ASCII character \xe5 in file red.py on line 10, but no encoding declared; see http://www.python.org/peps/pep-0263.html fo…...

【Unity】Game Framework框架学习使用

前言 之前用过一段时间的Game Framework框架&#xff0c;后来有那么一段时间都做定制小软件&#xff0c;框架就没再怎么使用了。 现在要做大型项目了&#xff0c;感觉还是用框架好一些。于是又把Game Framework拾起来了。 这篇文章主要是讲Game Framework这个框架是怎么用的…...

Linux(CentOS 7) yum一键安装mysql8

1、通过yum安装 &#xff08;1&#xff09;下载mysql 在Linux找个地方输入以下命令 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm &#xff08;2&#xff09;安装mysql yum 仓库配置文件 [rootVM-8-15-centos ~]# sudo rpm -Uvh mysql80-c…...

Kafka 快速入门(一)

1.1安装部署 1.1.1 集群规划 bigdata01bigdata02bigdata03zookeeperzookeeperzookeeperkafkakafkakafka 1.1.2 集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html 检查三台虚拟机的zk是否启动&#xff1a;zkServer.sh start 默认启动方式 1)解压…...

丹摩征文活动 | SD3+ComfyUI的图像部署实践

一、前言 作为Stability AI 推出的一款革命性的文本转图像开源模型&#xff0c;Stable Diffusion 3&#xff08;简称SD3&#xff09;在图像质量、文本内容生成、理解复杂指令以及资源利用效率方面&#xff0c;都有着不俗的表现。 SD3的Medium版本&#xff0c;拥有20亿参数&am…...

H.265流媒体播放器EasyPlayer.js网页web无插件播放器:如何优化加载速度

在当今的网络环境中&#xff0c;用户对于视频播放体验的要求越来越高&#xff0c;尤其是对于视频加载速度的期待。EasyPlayer.js网页web无插件播放器作为一款专为现代Web环境设计的流媒体播放器&#xff0c;它在优化加载速度方面采取了多种措施&#xff0c;以确保用户能够享受到…...

【Linux】进程状态的优先级

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…...

react中的组件传参

在React中&#xff0c;组件之间的数据传递是构建用户界面的关键部分。根据不同的需求和场景&#xff0c;有多种方式可以在React中传递参数&#xff0c;以下是对这些方式的详细说明&#xff1a; 一、通过props传递参数 这是React中最基本和最常用的数据传递方式。父组件通过属…...

HTML5:网页开发的新纪元

文章目录 前言一、HTML5技术概述二、主要特点及优势1. 多媒体支持2. 图形绘制3. 离线存储4. 表单控件增强5. 响应式设计 三、应用场景1. 游戏开发2. 在线教育3. 电子商务 四、面临的挑战结语 前言 在互联网技术快速发展的今天&#xff0c;H5&#xff08;HTML5的简称&#xff0…...

CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中&#xff0c;查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释&#xff0c;帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...