文章目录
认识与学习Bash
指令下达,可以直接 回车,敲入的命令就会直接执行,如果命令一行太长,就可以使用 \
操作符,表示 下一个 回车后 继续键入命令,在新行中,会有一个 >
表示 可以继续输入指令
一定要注意 \+Enter
中间不能有其他字符,一定是紧跟着的两个操作
如果要快速删除指令,可以采用下面的快捷方式:
bash中变量的定义规则:
- 变量与变量的内容通过
=
连接,等号两边不能直接有空格 - 变量名称只能是英文字母和数字,开头字符不能是数字
- 变量内容如果有空格符可以使用双引号
"
或'
将变量内容 结合起来- 双引号
""
内的特殊字符,如$
可以保持原有的特性 - 单引号
''
内的特殊字符,如$
就认为是一般字符,就是纯文本
- 双引号
- 使用 跳脱字符
\
(转义字符), 可以将特殊符号($
,,
等)变为一般字符 - 在 一串指令的执行中,如果需要 借助其他额外的 指令提供的信息,可以使用 反撇号 , 或者
$
一般使用 反撇号 包起来的指令,会被优先执行,执行的结果会作为 外部的输入信息 - 若变量需要在其他 子程序中执行,则需要用
export
来使变量生成环境变量
子程序就是在当前shell
下 启动另外一个新的shell
- 通常大写字符为系统默认变量,自行设定的变量可以使用小写字符,方便判断(只是一般的习惯,不是约定)
- 取消变量使用
unset + 变量名称
可以查看系统的环境变量:
系统预设变量
$
:表示当前 shell 的进程代号,即 process ID
?
: 上个执行指令的 返回值,一般 执行成功就返回0,否则就返回 非0
限制关系
bash可以限制用户的某些资源,包括开启的文件数量、CPU使用时间、内存使用量等,使用 ulimit
命令实现,主要参数如下:
想要复原ulimit
的设定最简单的方法就是 注销再登录,否则就需要重新用 ulimit
设定
这里要注意的是,如果一般身份的使用者,使用ulimit
设定了 -f
选项的文件大小,那么此用 只能继续减小文件容量,无法增加文件容量
变量的删除、取代与替换
变量设定好了之后,不仅仅可以进行删除,也可以进行取代和替换,基本规则如下:
个人感觉使用不多,就不再 赘述了,具体参见 10.2.8
变量别名
alias
可以给 某个命令设置一个别名,比如很常用的 ls -l
命令,设置别名为 ll
alias ll='ls -l'
alias
的定义规则与 变量的定义规则基本一致,alias 别名='指令 选项'
取消别名使用unalias
实现,unalias +别名
就可以实现取消这个 别名 的定义
获取历史命令
可以直接查询 曾经执行过的命令:
使用 history -w
可以将目前的 历史命令全部 写入到 histfile
文件中,在默认情况下,历史记录会写入 ~/.bash_history
中
正常情况下,历史命令的读取过程如下:
- 用户登录系统后,系统自动读取 家目录下的
~/.bash_history
,读取以前下达过的指令,该文件存储的 历史指令的数量,由 上面系统变量中的HISTFILESIZE
值的记录有关 - 在 注销登录后,系统会将 最近的
HISTFILESIZE
条记录保存到~/.bash_history
文件中,每次都保留最新的,舍弃旧的 - 使用
history -w
可以强制 写入 文件,即使还没有注销登录
在使用了history
命令之后,我们可以使用相关的功能帮我们执行命令:
基本上 history 的用途很大的!但是需要小心安全的问题!尤其是 root 的历史纪录文件,这是 Cracker
的最爱!因为不小心的 root 会将很多的重要数据在执行的过程中会被纪录在 ~/.bash_history 当中,
如果这个文件被解析的话,后果不堪吶!无论如何,使用 history 配合『 ! 』曾经使用过的指令下
达是很有效率的一个指令下达方法
如果在使用
xshell
这样的远程软件,有多个 root 用户登录,那么 history 该怎么保存?因为等到注销时才会更新记录文件,所以, 最后 注销 的那个 bash 才会是最后写入的数据。唔!如此一来其他 bash 的指令操作就不会被记录下来了 (其实有被记录,只是被后来的最后一个 bash 所覆盖更新了)
bash 的环境配置文件
首先要知道两个区别,因为这两个读取的文件是不同的
login shell
: 取得 bash 时需要完整的登录流程(需要输入 用户名和密码的过)non-login shell
: 不需要重复登录使用 的shell,比如登录图形化界面后打开终端的shell、在任意终端敲入的第二个shell命令,都不再需要重复 输入用户名和密码,都是non-login shell
上面中两种方式中,取得 bash 的情况是不同的,一般来说:login shell
只会读取以下这两个文件:
/etc/profile
:系统的整体设定,轻易不要修改
~/.bahs_profile 或 ~/.bash_login 或 ~/.profile
:不同用户设定,个性化数据
/etc/profile 整体bash文件
每个使用者登录 bash 一定会读取的配置文件,如果要配置所有使用者的整体环境,就需要在此文件中修改,有如下几个重要变量:
PATH
:依据 UID 决定 PATH变量要不要含有sbin
的系统指令目录MAIL
: 依据账号设定好的 使用者的 mailbox 到/var/spool/mail/username
USER
: 根据用户的账号设置这个内容HOSTNAME
: 根据主机的 hostname 指令决定此变量内容HISTSIZE
: 历史命令记录笔数,CentOS7 设定为 1000umask
: 包括 root 默认为 022,一般用户为 002,用于设定用户权限
/etc/profile
不止有上面的这几个字段,还会 使用很多配置文件来 进行设置,如下
/etc/profile.d/*.sh
: 在 该目录下,拓展名为.sh
的,并且当前用户对该文件有 r 权限,就可以被执行,主要用于 规范 bash 操作接口的 颜色、语系、ll
、ls
命令的别名、vi
、which
命令的别名等,如果要自行建立 配置文件,就可以在此目录下 自行建立.sh
后缀的文件。/etc/locale.conf
: 由/etc/profile.d/lang.sh
文件 引入,决定 bash 预设 使用哪个语系/user/share/bash-completion/completions/*
: 进行 指令的 选项/参数 补齐,由/etc/profile.d/bash_completion.sh
文件载入
bash 的 login shell 情况下所读取的整体环境配置文件其实只有 /etc/profile
,但是/etc/profile
还会呼叫出其他的配置文件,所以让我们的 bash 操作接口变的非常的友善啦
用户个人配置文件
用户个人的配置文件主要有三个,按照次序分别为以下三个:
~/.bash_profile
~/.bash_login
~/.profile
bash 的 登录脚本,只会读取上面三个文件中的一个,读取的顺序就是 按照上面 文件排列的原则 进行读取,如果有上面的文件,并且读取了,那么下面的文件就不会在读取了
查看 ~/.profile
文件源码如下:
[root@AliComputer etc]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
判断家目录下的 ~/.bashrc
存在否,若存在则读入 ~/.bashrc
所以 bash 配置文件整体的读入流程如下:
读入环境配置文件:source
由于 /etc/profile
和 ~/.bash_profile
文件都是在 取得 登录脚本之后才会读取的文件,所以如果在本地登录期间,修改了 配置文件,并不会立即生效,而是需要 注销后重新登录才会生效,这里使用 source
命令 可以是实现 直接重新读取配置文件而不用注销登录:
非登录环境配置和其他相关配置文件
如果是 non-login shell 这种非登录的情况,会读取 ~/.bashrc
,该文件如下:
[root@AliComputer etc]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# added by Anaconda3 5.3.1 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/root/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
\eval "$__conda_setup"
else
if [ -f "/root/anaconda3/etc/profile.d/conda.sh" ]; then
. "/root/anaconda3/etc/profile.d/conda.sh"
CONDA_CHANGEPS1=false conda activate base
else
\export PATH="/root/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda init <<<
alias php='php -c /www/server/php/74/etc/php-cli.ini'
alias php56='php56 -c /www/server/php/56/etc/php-cli.ini'
alias php74='php74 -c /www/server/php/74/etc/php-cli.ini'
[root@AliComputer etc]#
该文件会主动的呼叫 /etc/bashrc
这个文件,因为 /etc/bashrc
帮我们的 bash 定义出底下的数据:
- 依据不同的 UID 规范出
umask
的值; - 依据不同的 UID 规范出提示字符 (就是 PS1 变量);
- 呼叫
/etc/profile.d/*.sh
的设定
*你要注意的是,这个 /etc/bashrc
是 CentOS 特有的 (其实是 Red Hat 系统特有的),其他不同的
distributions 可能会放置在不同的文件就是了。由于这个 ~/.bashrc
会呼叫 /etc/bashrc
及
/etc/profile.d/*.sh
其他会影响 bash操作的文件如下:
/etc/man_db.conf
该文件 规范了man
操作 的查找路径~/.bash_history
预设的 历史命令 的存储路径~/.bash_logout
注销登录后,系统要执行的操作
最后
一起提高,慢慢变强。