8. shell基础

Shell基础知识

什么是shell

shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.默认安装版本是bash,他是sh的增强版本.

1.记录命令历史history

history默认记录最近执行的1000条命令,这些命令是保存在用户家目录下的.bash_history下. 正常退出shell,才会保存.

history -c //清除当前内存内的全部命令记忆

  1. !!: 连续两个!表示执行上一条命令

  2. !n: n指数字,表示执行命令历史中第n行命令.

  3. !字符串(字符串大于等于1)

    [root@localhost ~]# !pw

    pwd

    /root

2.别名alias

bash特有功能之一,通过alias把一个常用很长的命令取个简单易记的名字, unalias可以解除别名

格式: alias[命令别名]=[具体命令]

如果在 bash 中设置命令别名,则重启后别名失效

####3. 通配符 与特殊符号 ####

符号 意义

* 代表0-无穷个 任意字符

? 代表有且只有一个字符

[ ] 代表有且仅有一个字符,且为[...]中所枚举的其中一个, 如 [13579]

[-] 同上,只不过是一个范围,如[ 0-9 ],[a-z]等

[^] 有且仅有一个,且不是所枚举的任何字符,如:[^a-zA-Z] 代表该位不是字母

特殊符号

符号 内容

# 批注号

\ 转义符号,将特殊字符或通配符还原成一般字符

| 管道符

; 命令衔接符,连续执行两条命令

~ 当前用户家目录

$ 取用变量符号

& 工作控制,将指令变成后台工作

! 逻辑非

>、>> 数据流重定向,output

<、<< 数据流重定向,input

' ' 单引号,无法引用变量

" " 双引号,可以引用变量

` ` 指令引用,功能同 $(command)

4.输入,输出重定向

执行命令,数据流走向

####standard output & standard error output

标准输出,即命令成功执行时,将执行结果输出至文件 or 设备 符号:> (覆盖导出) 或 >> (追加导出)

  1. 标准输出(覆盖): >如果多次命令的结果导出至同一个文件, 并采用覆盖方式,那该文件将仅保留最后一次输出的结果

  2. 标准输出(追加): >>如果多次命令结果导出至同一个文件,若采用追加方式,那每次命令的结果都会追加至该文件的末尾

  3. 标准错误输出(覆盖): 2>

  4. 标准错误输出(追加): 2>>

  5. 同时进行标准输出与标准错误输出,如果同时想将正常输出与错误输出都导入到同一个文件,且按照顺序,使用 2>&1 或 &>

标准输入(以 Ctrl + d 结束) [root@choco-01 ~]# cat > aaa 123 456 [Ctrl + d]

[root@choco-01 ~]# cat aaa 123 456

[root@choco-01 ~]# cat aaa

[root@choco-01 ~]# cat > aaa < .bashrc # .bashrc 的内容替换了屏幕输入,并被放到 aaa 文件中

[root@choco-01 ~]# cat aaa # .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

标准输入(以 指定字符 结束)

[root@choco-01 ~]# cat > bbb << "fuckoff" > 123123 > 456456 > fuckoff [root@choco-01 ~]#

6.管道符

用于将前一个指令的输出作为后一个指令的输入, 管道的概念与数据流重定向不同,管道只是在输出至屏幕前多加一道工序,而配合管道的这些工序,往往是字符处理软件

例子:

ls /etc/ | more # 原本要直接输出至屏幕的信息, 用 more 进行了加工

ls /etc/ | grep "bash" # 原本直接输出至屏幕的信息, 用 grep "bash" 进行了加工, 筛选出了关键字

巧用垃圾桶

Linux 下有一个特殊的设备 /dev/null ,所有被写入该设备的东西都会消失,所以如果有部分信息不想输出至文件,也不想输出至屏幕,那就输出至 /dev/null 吧

作业控制

当运行一个进程时,你可以使它暂停(按 Ctrl+z),然后使用 fg 命令恢复它,利用 bg 命令使他到后台运行,你也可以使它终止(按 Ctrl+c)。

1.查看后台中的任务jobs

[root@localhost tmp]# jobs [1] 已停止 vim aaa [2]- 已停止 vim bbb [3]+ 已停止 vim ccc

加号: 最新被扔进来的

减号: 次新被扔进来的

更早被扔进来的就不带符号了

jobs 的选项:

  • -l:同时列出任务的 PID
  • -r: 仅列出后台中处于 "running" 的任务

  • -s: 仅列出后台中处于 "stop" 的任务

jobs,可以看到在被暂停或者在后台运行的任务,使用 jobs 命令可以看到两个或多个任务,那么使用 bg 或者 fg 的时候,就需要在后面加一个编号了

2.后台工作拿到前台来或后台暂停任务的激活,不加编号, 默认会先将带加号执行. 最新被扔进来的

3.丢入后台需要使用在命令后边加一个&符号,中间有个空格

4.kill 命令语法很简单,直接在后面加 pid 即可,如果遇到杀不死的进程时,可以在 kill 后面加一个选 项: kill -9 [pid]

kill 的用法

kill -<signal> %<job_num>

kill -<signal> <PID>

常用 signal

  • -1: 重新读取参数的配置文件(类似 reload)

  • -9: 立即强制删除一个任务

  • -15: 已正常方式结束一个任务

kill 默认是以 PID 来进行进程杀死的, 若要杀死某个任务号, 则任务号前必须加 %

-9是暴力杀死, -15是温柔杀死, 两者的区别在杀死 vim 时较为明显: 若用 -9 杀死, 则会留有 .filename.swp 文件, 下次再进行 vim 时会有修复提示; 而若用 -15 杀死, 则能较好地料理后事, 不会有这种缓存文件存在.

shell变量

变量的种类

环境变量

往往以纯大写来命名, bash 的子进程中仍可使用

自定义变量

推荐使用纯小写来命名, 不经过声明, 则在 bash 的子进程中无法使用

变量的命名

由字母、数字、下划线组成,且只能以非数字开头

变量的设定

语法:变量名=变量值

注意-1:如果变量值中存在空格,需要用单引号或双引号将变量值括起来

注意-2:如果变量值中有引用其他变量,需要用双引号将变量值括起来

变量的相关命令

echo 功能:打印变量的内容

export 功能:将变量转换为环境变量

[root@choco-01 ~]# echo $full Choco Lee @ China [root@choco-01 ~]# bash [root@choco-01 ~]# echo $full # 进入子 shell 后, 变量失效 [root@choco-01 ~]# exit exit [root@choco-01 ~]# export full # 声明该变量为环境变量 [root@choco-01 ~]# bash [root@choco-01 ~]# echo $full # 进入子 shell 后, 变量仍让有效 Choco Lee @ China

env 功能:查看环境变量

declare 用法: declare [-aixr] <var_name>

选项:

  • -a:定义变量为数组

  • -i:定义变量为纯数字

  • -x:定义变量为环境变量

  • -r:定义变量为 readonly

常用环境变量
	HOME: 当前用户的家目录
	HOSTNAME: 该主机的主机名
	USER: 当前用户的用户名
	SHELL: 当前使用的 shell 类型
	HISTSIZE: 可存储的历史命令条数
	MAIL: 当前用户的邮箱
	PATH: 可执行命令的所在目录
	LANG: 当前语系
	PS1: 命令提示符的格式, 可玩性较高, 但工作中不常用, 可自行 man bash 查看 PS1 的设置方法
	PS2: 输入命令时强制换行后的提示符
	OSTYPE: 当前操作系统类型
	MACHTYPE: 安装的机器类型
	HOSTTYPE: 主机的位数, x86 还是 x86_64

环境变量配置文件

1.login与non-login

  • login shell:取得 bash 时需要完整的登录流程。如由 tty1-tty6登录时,需要输入用户的账号和密码

读取的文件:

  • /etc/profile :系统整体的设定,对所有用户皆生效

  • ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:用户的个人设定 但是各个文件中可能又会调用其他的文件,所以一般来说,login shell 读取的文件如下图所示:

  • non-login shell:取得 bash 接口的方法不需要重复登录的举动,如在 bash 环境下,再次执行bash命令进入子 shell 时,不需要输入账号和密码

2./etc/profile (login shell)

该文件会根据用户的 UID 设定好许多环境变量以及参数

设定环境变量

  • PATH:根据 UID 决定PATH 变量是否要包含 sbin 目录
  • USER:根据 id 命令的结果,显示用户名
  • LOGNAME:等于 USER
  • MAIL:配置好用户的邮箱
  • HOSTNAME:根据 hostname 指令,决定该变量值
  • HISTSIZE:直接设定历史命令记录的条数为 1000

调用 /etc/profile.d/*.sh

for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$I" else . "$i" >/dev/null fi fi done

/etc/profile.d/ 下的脚本,主要是进行 bash 颜色、语系、vi 的别名、which 的别名等设置

3.~/.bash_profile (login shell)

根据之前流程图的描述,bash shell 读取完通用配置后,才开始进行用户个性化配置的读取。

其实用户个性化配置的文件不止 ~/.bash_profile 一个,还可能有 ~/.bahs_login 和 ~/.profile

为什么有这么多个性化配置文件呢?主要是为了给从其他种类的 shell 转来使用 bash 的用户提供便利,满足其习惯罢了。

所以我们往往只能见到 ~/.bash_profile 而已

三种文件的读取顺序及规律

~/.bash_profil

~/.bash_login

~/.profile

其实 bash 的 login shell 只会读取上述文件中的其中一个, 读取顺序依照上面的排序, 一旦读取到其中一个文件, 就不再继续读取其余文件

.~/.bash_profile 内容

[root@localhost ~]# 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

~/.bash_profile 调取了 ~/.bashrc 文件, 并将 ~/bin 目录加入到 PATH 变量中

4.~/.bashrc (non-login shell)

当通过 non-login shell 取得 bash 后, 仅会读取 ~/.bashrc 文件

先来看看 ~/.bashrc 的内容吧

[root@localhost ~]# 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

定义了几个别名, 然后又调用了 /etc/bashrc

/etc/bashrc 会完成以下任务

  • 根据不同的 UID 设置 umask 值
  • 根据不同的 UID 设置 PS1 变量
  • 调用 /etc/profile.d/*.sh

ps. 如果家目录下没有 .bashrc 文件, 那么你的 bash 提示符可能会变成如下样子 -bash-4.2#

但是没关系, 还记得 /etc 下有个模板目录吗? 就是 /etc/shel/. 把该目录下的 .bashrc 文件复制到家目录即可.

转载于:https://my.oschina.net/u/3851442/blog/3033437

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值