Linux基础(十四)——BASH

news2024/11/23 19:13:46

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 3
  274  read -p "Please input your name:" myname
  275  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 programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重学 MySQL】八十二、深入探索 CASE 语句的应用

【重学 MySQL】八十二、深入探索 CASE 语句的应用 CASE语句的两种形式CASE语句的应用场景数据分类动态排序条件计算在 SELECT 子句中使用在 WHERE子句中使用在 ORDER BY 子句中使用 注意事项 在MySQL中&#xff0c;CASE 语句提供了一种强大的方式来实现条件分支逻辑&#xff0c…

由播客转向个人定制的音频频道(1)平台搭建

项目的背景 最近开始听喜马拉雅播客的内容&#xff0c;但是发现许多不方便的地方。 休息的时候收听喜马拉雅&#xff0c;但是还需要不断地选择喜马拉雅的内容&#xff0c;比较麻烦&#xff0c;而且黑灯操作反而伤眼睛。 喜马拉雅为代表的播客平台都是VOD 形式的&#xff0…

7+纯生信,单细胞识别细胞marker+100种机器学习组合建模,机器学习组合建模取代单独lasso回归势在必行!

影响因子&#xff1a;7.3 研究概述&#xff1a; 皮肤黑色素瘤&#xff08;SKCM&#xff09;是所有皮肤恶性肿瘤中最具侵袭性的类型。本研究从GEO数据库下载单细胞RNA测序&#xff08;scRNA-seq&#xff09;数据集&#xff0c;根据原始研究中定义的细胞标记重新注释各种免疫细胞…

uniapp解析蓝牙设备响应数据bug

本文章为了解决《uniapp 与蓝牙设备收发指令详细步骤(完整项目版)》中第十步的Array 解析成 number函数bug 1、原代码说明 function array16_to_number(arrayValue) {const newArray arrayValue.filter(item > String(item) ! 00 || String(item) ! 0)const _number16 ne…

【递归回溯与搜索算法篇】算法的镜花水月:在无尽的自我倒影中,递归步步生花

文章目录 递归回溯搜索专题&#xff08;一&#xff09;&#xff1a;递归前言第一章&#xff1a;递归基础及应用1.1 汉诺塔问题&#xff08;easy&#xff09;解法&#xff08;递归&#xff09;C 代码实现时间复杂度和空间复杂度易错点提示 1.2 合并两个有序链表&#xff08;easy…

大数据开发面试宝典

312个问题&#xff0c;问题涵盖广、从自我介绍到大厂实战、19大主题&#xff0c;一网打尽、真正提高面试成功率 一、Linux 1. 说⼀下linux的常⽤命令&#xff1f; 说一些高级命令即可 systemctl 设置系统参数 如&#xff1a;systemctl stop firewalld关闭防火墙 tail / hea…

链表归并与并集相关算法题|两递增归并为递减到原位|b表归并到a表|两递减归并到新链表(C)

两递增归并为递减到原位 假设有两个按元素递增次序排列的线性表&#xff0c;均以单链表形式存储。将这两个单链表归并为一个按元素递减次序排列的单链表&#xff0c;并要求利用原来两个单链表的节点存放归并后的单链表 算法思想 因为两链表已按元素值递增次序排列&#xff0…

【RabbitMQ】06-消费者的可靠性

1. 消费者确认机制 没有ack&#xff0c;mq就会一直保留消息。 spring:rabbitmq:listener:simple:acknowledge-mode: auto # 自动ack2. 失败重试机制 当消费者出现异常后&#xff0c;消息会不断requeue&#xff08;重入队&#xff09;到队列&#xff0c;再重新发送给消费者。…

【陕西】《陕西省省级政务信息化项目投资编制指南(建设类)(试行)》-省市费用标准解读系列07

《陕西省省级政务信息化项目投资编制指南&#xff08;建设类&#xff09;&#xff08;试行&#xff09;》规定了建设类项目的费用投资测算方法与计价标准&#xff0c;明确指出建设类项目费用包括项目建设费和项目建设其他费&#xff08;了解更多可直接关注咨询我们&#xff09;…

VB6.0桌面小程序(桌面音乐播放器)

干货源码 Imports System.IO Imports System.Security.Cryptography Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Button1.Text “上一曲” Button4.Text “播放” Button3.Text “下一曲” Button2.Text “顺序播…

docker安装jdk8

1、拉取镜像 docker pull openjdk:82、运行镜像 docker run -d --restartalways --network portainer_network -it --name jdk8 openjdk:8命令 作用 docker run 创建并启动一个容器 –name jdk8 将容器取名为jdk8 -d 设置后台运行 –restartalways 随容器启动 –network port…

【人工智能】Transformers之Pipeline(二十三):文档视觉问答(document-question-answering)

​​​​​​​ 目录 一、引言 二、文档问答&#xff08;document-question-answering&#xff09; 2.1 概述 2.2 impira/layoutlm-document-qa 2.2.1 LayoutLM v1 2.2.2 LayoutLM v2 2.2.3 LayoutXLM 2.2.4 LayoutLM v3 2.3 pipeline参数 2.3.1 pipeline对象实例化…

微服务day06

MQ入门 同步处理业务&#xff1a; 异步处理&#xff1a; 将任务处理后交给MQ来进行分发处理。 MQ的相关知识 同步调用 同步调用的小结 异步调用 MQ技术选型 RabbitMQ 安装部署 其中包含几个概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 …

[CKS] K8S RuntimeClass SetUp

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于RuntimeClass创建和挂载的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS…

Halcon基于laws纹理特征的SVM分类

与基于区域特征的 SVM 分类不同&#xff0c;针对图像特征的 SVM 分类的算子不需要直接提取 特征&#xff0c;下面介绍基于 Laws 纹理特征的 SVM 分类。 纹理在计算机视觉领域的图像分割、模式识别等方面都有着重要的意义和广泛的应 用。纹理是指由于物体表面的物理属性不同所…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

Maven 中央仓库地址 mvnrepository.com

下载一些 jar 包驱动&#xff0c;不需用去官网下了&#xff0c;直接去 Maven 中央仓库&#xff0c;高效、简单 Maven 中央仓库地址 https://mvnrepository.com/open-source 我们下期见&#xff0c;拜拜&#xff01;

2024 年将 Postman 文档导出为 HTML 或 Markdown

2024 年将 Postman 文档导出为 HTML 或 Markdown

Anaconda安装库

相信有些人可能遇到pip直接安装失败&#xff0c;conda直接安装失败&#xff0c;pip镜像安装仍然失败的可能性&#xff0c;下面我记录一下我的一种解决方法。 我使用的是上面的miniconda3配置。 1.创建虚拟环境 首先&#xff0c;先新建一个虚拟环境 conda create -n py39 pyt…