Linux中所有新进程会继承父进程的环境变量,如各种PATH查找路径、语言设置,编码设置等,不注意就会掉进陷阱里。

常见的几种环境变量问题:

  1. crontab的环境变量问题,通常与登录用户是不同的
  2. 语言问题

crontab的不讲了,一般都会比较注意。语言问题很多人没有注意,现在的linux国际化做的很不错,一般安装的时候都会有中文的环境,一些命令的输出都是中文的,需要注意

wang@a:~$ env|grep LANG
LANG=zh_CN.UTF-8
GDM_LANG=zh_CN
LANGUAGE=zh_CN:en

常见的几个可能有问题的命令:

  1. ifconfig
  2. date

中文环境下ifconfig和date的输出

wang@a:~$ date
2011年 06月 01日 星期三 14:14:15 CST
wang@a:~$ ifconfig eth0
eth0      Link encap:以太网  硬件地址 00:24:e8:e6:b4:49
inet 地址:192.168.10.65  广播:192.168.10.255  掩码:255.255.255.0
inet6 地址: fe80::224:e8ff:fee6:b449/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
接收数据包:121651 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:99129 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:52210869 (52.2 MB)  发送字节:10558533 (10.5 MB)
中断:17

如果你的一些操作依赖与这些命令的输出,就要想一下了。

除了shell脚本中,python程序中也可能会有这种问题,以登录用户启动的脚本调用系统命令,或者某些与环境相关的函数,也会取到意料之外的结果。

>>> import time
>>> time.strptime("01/Jun/2011:10:53:34", "%d/%b/%Y:%H:%M:%S")
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/usr/lib/python2.7/_strptime.py", line 454, in _strptime_time
return _strptime(data_string, format)[0]
File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data '01/Jun/2011:10:53:34' does not match format '%d/%b/%Y:%H:%M:%S'

查看下自己的locale

wang@a:~$ locale -a
C
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
POSIX
zh_CN.utf8
zh_SG.utf8
>>> locale.setlocale(locale.LC_ALL, 'C')
'C'
>>> time.strptime("01/Jun/2011:10:53:34", "%d/%b/%Y:%H:%M:%S")
time.struct_time(tm_year=2011, tm_mon=6, tm_mday=1, tm_hour=10, tm_min=53, tm_sec=34, tm_wday=2, tm_yday=152, tm_
isdst=-1)

C 是标准c locale,是所有系统上都支持的locale。 最后推荐的解决方案:

#shell中:
export LANG=

#python中:
import locale
locale.setlocale(locale.LC_ALL, 'C')

参考:

The only locale names you can count on finding on all operating systems are these three standard ones:

“C” This is the standard C locale. The attributes and behavior it provides are specified in the ISO C standard. When your program starts up, it initially uses this locale by default. “POSIX” This is the standard POSIX locale. Currently, it is an alias for the standard C locale. "" The empty name says to select a locale based on environment variables. See Locale Categories.