为何写脚本
每次用新的机器,都要把python的环境给安装一遍~so,这是一件很操蛋的问题,就shell练手写了一个code,嘿嘿,渣渣技术~
测试环境
我爱vagrant,一条命令直接还原成干净的测试环境,大爱啊~
脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
#!/bin/bash
# Auther: zhuima
# Date: 2014-06-26
# Function: create python env
#
REVTAL=0
# import Functions
.
/etc/rc
.d
/init
.d
/functions
# check network
.
/etc/sysconfig/network
if
[ $NETWORKING =
'no'
];
then
exit
$REVTAL
fi
# install epel yum source
function
epel_install(){
if
rpm --version &>
/dev/null
;
then
rpm -ivh http:
//mirrors
.ustc.edu.cn
/fedora/epel/6/x86_64/epel-release-6-8
.noarch.rpm
else
exit
$REVTAL
print
"please checking your yum configure!"
fi
}
# install base packages
function
base_packages(){
if
yum repolist &>
/dev/null
;
then
yum
install
yum
install
zlib-devel
bzip2
-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel patch -y
else
exit
$REVTAL
print
"please checking your yum configure!"
fi
}
# install pip
function
pip_install(){
if
yum repolist &>
/dev/null
;
then
yum
install
python-pip -y
else
exit
$REVTAL
print
"please checking your yum configure!"
fi
}
# install ipython
function
ipython_install(){
if
yum repolist &>
/dev/null
;
then
yum
install
ipython -y
else
exit
$REVTAL
print
"please checking your yum configure!"
fi
}
# install pyenv
function
pyenv_install(){
if
git --version &>
/dev/null
;
then
cd
/`
whoami
` && git clone git:
//github
.com
/yyuu/pyenv
.git .pyenv
else
yum
install
git -y
cd
/`
whoami
` && git clone git:
//github
.com
/yyuu/pyenv
.git .pyenv
fi
}
# setting pyenv env
function
pyenv_env(){
echo
'export PYENV_ROOT=$HOME/.pyenv'
>>
/etc/profile
echo
'export PATH=$PYENV_ROOT/bin:$PATH'
>>
/etc/profile
#echo 'eval $(pyenv init -)' >> /etc/profile
# exec pyenv.sh
if
[ -e
/etc/profile
];
then
source
/etc/profile
else
echo
"Files is not exists"
exit
$REVTAL
fi
}
# install python 2.7.6
function
python_install(){
if
pyenv versions &>
/dev/null
;
then
pyenv
install
2.7.6
else
exit
$REVTAL
print
"please checking your pyenv configure"
fi
}
# install ansible
function
install_ansible(){
if
pip --version &>
/dev/null
;
then
pip
install
ansible
else
yum
install
pip -y
pip
install
ansible
fi
}
while
:;
do
cat
<< EOF
+-------------------------------------------+
|1、Install epel_install |
|2、Install base_packages |
|3、Install pip_install |
|4、Install ipython_install |
|5、Install pyenv_install |
|6、Install pyenv_env |
|7、Install python2.7.6_install |
|8、One-Click Setup |
|9、[Q|q|quit] to quit |
+-------------------------------------------+
EOF
read
-p
"select which one packages you want to install: "
choice
case
$choice
in
1)
epel_install
;;
2)
base_packages
;;
3)
pip_install
;;
4)
ipython_install
;;
5)
pyenv_install
;;
6)
pyenv_env
;;
7)
python2.7.6_install
;;
8)
epel_install
base_packages
pip_install
ipython_install
pyenv_install
pyenv_env
python_install
source
/etc/profile
;;
Q|q|quit)
exit
$REVTAL
;;
*)
echo
"Usage: select one number(1|2|3|4|5|6|7|8|9)"
exit
$REVTAL
;;
esac
done
|
关于脚本中使用. 还是source的问题
source filename 与 sh filename 及./filename执行脚本的区别在那里呢?
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
来源: http://www.blogjava.net/jjshcc/archive/2012/12/12/392904.html
关于环境变量配置文件:
1.Linux的变量种类
按变量的生存周期来划分,Linux变量可分为两类:
1.1 永久的:需要修改配置文件,变量永久生效。
1.2 临时的:使用export命令声明即可,变量在关闭shell时失效。
2.设置变量的三种方法
2.1 在/etc/profile文件中添加变量【对所有用户生效(永久的)】
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量
# vi /etc/profile
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
2.2 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bash_profile
$ vi /home/guok/.bash.profile
添加如下内容:
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。
2.3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是 有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
3.环境变量的查看
3.1 使用echo命令查看单个环境变量。例如:
echo $PATH
3.2 使用env查看所有环境变量。例如:
env
3.3 使用set查看所有本地定义的环境变量。
unset可以删除指定的环境变量。
4.常用的环境变量
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE 语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$
来源: http://285118.blog.51cto.com/275118/1174676
后记
bug:由于每次都是su切换到root账户的,所以/etc/profile中pyenv的环境变量不生效,需要重新source下才行,这也是一个小bug~
原因:.pyenv文件在root账户家目录下,而PATH中添加的是当前$HOME/.pyenv/bin,除了root家目录下有.pyenv之外,普通用户家目录下没有,所以就导致pyenv的环境变量不生效的问题~
解决办法:
su切换的时候使用 su - 即可
PS:
实际生产环境中,多是在普通用户下创建.pyenv文件夹的,所以这个问题也不是问题了
本文转自lovelace521 51CTO博客,原文链接:http://blog.51cto.com/lovelace/1431666,如需转载请自行联系原作者