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 被拿来运行? 很有趣吧! 基本上, 指令运行的顺序可以这样看:
- 以相对/绝对路径执行指令, 例如“ /bin/ls ”或“ ./ls ”;
- 由 alias 找到该指令来执行;
- 由 bash 内置的 ( builtin) 指令来执行;
- 通过 $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