博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
24.管道符和作业控制 shell变量 环境变量配置文件
阅读量:5930 次
发布时间:2019-06-19

本文共 5140 字,大约阅读时间需要 17 分钟。

hot3.png

8.6 管道符和作业控制

8.7/8.8 shell变量

8.9 环境变量配置文件

 

8.6 管道符和作业控制:

~cat 1.txt |wc -l ; cat 1.txt |grep 'aaa'

管道符前面的命令输出的结果给后面的命令

 

~ctrl z 暂停一个任务

比如在编辑一个文件,想要查看磁盘空间,可以ctrl z暂停。fg可以把暂停的这个任务在调回来

可暂停多个任务

~jobs查看后台的任务

jobs可以把ctrl z的任务调出来,调出所有后台的任务

~bg[id]把任务调到后台

可以把一个正在执行的任务,搞到后台。

多个任务可后面加序号

不加序号就是执行最后一个

~fg[id]把任务调到前台

jobs可查看多个已停止的任务,fg 后面加序号,可回到这个序号的任务

不加序号,执行最后一个

~命令后面加&直接丢到后台

~两个终端是无法使用jobs查看的,但可以查看进程

 

---------------------------------------------------------------------------------------------------------------------------------------

 

8.7/8.8 shell变量:

 

~1.PATH,HOME,PWD,LOGNAME

~2.env命令

~3.set命令多了很多变量,并且包括用户自定义的变量

~4.自定义变量a=111

~5.变量名规则:字母、数字下划线,首位不能为数字

可以写a=1 或者a_1=1 又或者_a=1,但是不能写1=1

~6.变量值有特殊符号是需要用单引号括起来

例如空格,a=‘1 2 3’

~7.变量的累加,(重点,实例有介绍单引号、双引号的用法)

可累计查看 echo $a$b

双引号、单引号

~8.全局变量export b=2 (详细看实例)

bash生成一个子shell

exit返回上一个shell

在一个终端下设置的变量设置的,在另一个下看不到的叫非全局变量或本地变量

全局变量只往下生效,子文件-子子文件这样生效。往上不生效,子文件不会影响父文件

也就是说,建立了1文件和2文件,1能使用2的变量,但2不能使用1的变量

运行子shell,直接运行bash

~9.unset变量

unset后面跟变量的名字,可取消名字

 

变量的名字通常是大写的英文字母

变量的值不一定是大写的

env可查看变量

set也可查看变量,也包括用户的变量,set一般是shell脚本

 

4.

我们可以自定义用户的变量,就是PATH

[root ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root ~]# a=111

[root ~]# echo $a

111

[root ~]# set |grep '111'

_=111

a=111

当然不是系统内核的。他只在set里找到,也就是用户自定义的变量

 

5.

[root ~]# a=1

[root@localhost ~]# echo $a

1

[root@localhost ~]# a_1=1

[root@localhost ~]# echo $a_1

1

[root@localhost ~]# _a=1

[root@localhost ~]# echo $_a

1

[root@localhost ~]# 1=1

-bash: 1=1: 未找到命令

[root@localhost ~]# 2=a

-bash: 2=a: 未找到命令

 

6.

[root@localhost ~]# a=1 2 3

-bash: 2: 未找到命令

[root@localhost ~]# a='1 2 3'

[root@localhost ~]# echo $a

1 2 3

 

7.

[root@localhost ~]# a=1

[root@localhost ~]# b=2

[root@localhost ~]# echo $a$b 简单的可以直接写

12

[root@localhost ~]# a='a$bc' a=复杂的 用单引号括起来

[root@localhost ~]# echo $a$b 再次$a$b

a$bc2 a就代表了上边用单引号括起来的字符

[root@localhost ~]# c=a"$b"c 如果想要让c=$b的值,就要用双引号括起来

[root@localhost ~]# echo $c 所以他所表达出来的值,就是$b结果的值,而不是代表$b这个字符

a2c

 

8.

按 w 可以看到有几个登录的

[root@localhost ~]# w

15:26:00 up 8 min, 2 users, load average: 0.01, 0.12, 0.12

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 192.168.159.1 15:19 0.00s 0.13s 0.04s w

root pts/1 192.168.159.1 15:25 23.00s 0.05s 0.05s -bash

登录的 各分配了 分别从这个IP

都是root TTY 登过来

 

两个终端我们分别看一下,各自的TTY

[root@localhost ~]# echo $SSH_TTY

/dev/pts/0 分别对应以上的TTY

[root@localhost ~]# echo $SSH_TTY

/dev/pts/1 分别对应以上的TTY

 

我们在终端1上设置axin=linux这个变量,在终端2上是没有的

[root@localhost ~]# axin=linux

[root@localhost ~]# echo $axin

linux 终端1上定义,有这个变量

[root@localhost ~]# echo $axin

终端2上就没有

[root@localhost ~]#

 

shell本身是一个进程。我们输入 bash,相当于进入另一个终端。再w一下

[root@localhost ~]# bash

[root@localhost ~]# w 发现仍然在pts/0

15:38:11 up 20 min, 2 users, load average: 0.00, 0.01, 0.05

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 192.168.159.1 15:19 3.00s 0.17s 0.02s w

root pts/1 192.168.159.1 15:25 3:47 0.05s 0.05s -bash

pstree一下,我们linux上没有pstree这个命令,安装了psmisc

[root@localhost ~]# pstree

systemd─┬─NetworkManager───2*[{NetworkManager}]

├─VGAuthService

├─agetty

├─auditd───{auditd}

├─chronyd

├─crond

├─dbus-daemon───{dbus-daemon}

├─firewalld───{firewalld}

├─irqbalance

├─master─┬─pickup

│ └─qmgr

├─polkitd───5*[{polkitd}]

├─rsyslogd───2*[{rsyslogd}]

├─sshd─┬─sshd───bash───bash───pstree 我们现在这这个位置,前面的bash是我们刚打开的新 的bash,在他的基础上运行这个命令叫pstree

│ └─sshd───bash

├─systemd-journal

├─systemd-logind

├─systemd-udevd

├─tuned───4*[{tuned}]

└─vmtoolsd───{vmtoolsd}

我们再运行echo $axin,发现也没有生效我们之前设置的axin=linux

[root@localhost ~]# echo $axin

 

[root@localhost ~]#

我们exit,退出刚才那个bash

[root@localhost ~]# exit

exit

[root@localhost ~]# echo $axin 发现有有了刚才设置的axin=linux

linux

像这样的叫为非全局变量,或者本地变量(load),仅仅在这个终端下生效

那怎么变成全局的呢:

[root@localhost ~]# export axin=linux 使用export

[root@localhost ~]# echo $axin

linux

[root@localhost ~]# bash 我们再bash一个

[root@localhost ~]# echo $axin 就有了

linux

这个就叫做全局变量,也就是说在一开始的那个bash我们设置了axin=linux,那么他的子bash或者子子bash都生效。

但是在另一个终端下不会生效,例如,我们再打开另一个终端,pstree

[root@localhost ~]# pstree

systemd─┬─NetworkManager───2*[{NetworkManager}]

├─VGAuthService

├─agetty

├─auditd───{auditd}

├─chronyd

├─crond

├─dbus-daemon───{dbus-daemon}

├─firewalld───{firewalld}

├─irqbalance

├─master─┬─pickup

│ └─qmgr

├─polkitd───5*[{polkitd}]

├─rsyslogd───2*[{rsyslogd}]

├─sshd─┬─sshd───bash───bash───bash

│ └─sshd───bash───pstree 我们在这,他跟上面的是并列关系,所以不会生效

├─systemd-journal

├─systemd-logind

├─systemd-udevd

├─tuned───4*[{tuned}]

└─vmtoolsd───{vmtoolsd}

演练了这么多,我们得出一个结论。

所以,所谓的全局变量,是向下的。在这个shell的基础上生成子shell,子子shell等等,这样的话是生效的。不会向上的全局的!!

 

---------------------------------------------------------------------------------------------------------------------------------------

 

8.9 环境变量配置文件:

 

系统层次(这两个文件不要动):

~ /etc/profile 用户环境变量,交互,登录才执行

我们登录才会执行。他会调用bashrc

~ /etc/bashrc 用户不用登录,执行shell就生效

我们执行shell就可以生效。bashrc是执行shell脚本的时候,用户不用登录,就可以执行shell脚本,只要执行shell,他就会调用bashrc里面的一些配置

用户层次:

~ ~/.bashrc

~ ~/.bash_profile

~ ~/.bash_history

~ ~/bash_logout

用户退出的时候,需要做的一些操作

例如,让一个用户每次退出的时候都要删除他的命令历史。就可以把这个配置文件放到logout里面

~ ps1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$'

ps1表示 [root@axinlinux-01 ~]# 。echo $ps1可以查看这些配置文件,都是可以改的。但平常不会 去动

后面的这些字符串是设置 [root@axinlinux-01 ~]# 的颜色

ps2表示 进入另一个终端,例如MYSQL的时候所显示的。但仅仅是一个>

 

转载于:https://my.oschina.net/u/3866149/blog/1838462

你可能感兴趣的文章
Java001-流行的编程语言Java
查看>>
阿里开发者们的第17个感悟:无细节不设计,无设计不架构
查看>>
React-防止内存泄漏处理
查看>>
Understand .sync in Vue
查看>>
2018年IT界规模最大裁员,作为程序员的你慌了吗?
查看>>
dependencies 和 devDependencies 的异同
查看>>
弹幕,是怎样练成的?
查看>>
扁平数组和树形结构的相互转换
查看>>
FIBOS 发布了服务于区块链项目落地的稳定币——FOD
查看>>
提高 JavaScript 开发效率的高级 VSCode 扩展!
查看>>
深入浅出Node.js - 异步编程
查看>>
不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
查看>>
CreateJS神坑之旅
查看>>
SQLServer之删除视图
查看>>
[LeetCode] 171. Excel Sheet Column Number
查看>>
SAP成都研究院DevOps那些事
查看>>
基于drone的CI/CD,对接kubernetes,见证灵活与自由,CI/CD对接kubernetes
查看>>
webpack4配置之分享几个常用插件
查看>>
【面试】Java基础的那些事-Thr
查看>>
MySQL JSON数据类型操作
查看>>