Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19912643
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类: LINUX

2007-12-29 05:26:15

http://www.ibm.com/developerworks/cn/linux/l-cn-posix/index.html

Linux 技巧:谈 Linux GNU 实用工具兼容性

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

将打印机的版面设置成横向打印模式

将此页作为电子邮件发送

将此页作为电子邮件发送



王 丽娜 (), 软件工程师, IBM 中国软件开发中心

2007 年 11 月 29 日

GNU utility 的默认行为和 POSIX 标准有不兼容的地方。Linux 系统的不同版本采用了不同版本的 POSIX 标准,而 POSIX 不同版本标准之间有不兼容的地方。这两个不兼容问题对于产品在 Linux 各个平台之间的可移植性影响很大。

POSIX 定义:

POSIX 表示可移植操作系统接口:Portable Operating System Interface,电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。

GNU utility 定义:

GNU 是 GNU Is Not UNIX 的递归缩写。Linux 的开发使用了许多 GNU 工具。Linux 系统上用于实现 POSIX 标准的工具几乎都是 GNU 项目开发的,如 emacs 编辑器、著名的 GNU C 和 C++ 编译器。

兼容性问题 1:

GNU/Linux 与 POSIX 标准基本是兼容的,但是在一些情况下,GNU utility 的默认行为和 POSIX 标准有不兼容的地方。

兼容性问题 2:

Linux 系统的不同版本采用了不同版本的 POSIX 标准,而 POSIX 不同版本标准之间有不兼容的地方。

这两个不兼容问题对于产品在 Linux 各个平台之间的可移植性影响很大,因此,掌握如何解决这两个兼容性问题非常重要。





回页首


在一些情况下,GNU utility 的默认行为和 POSIX 标准不兼容。为了解决这种不兼容情况,Linux 系统引入了环境变量’POSIXLY_CORRECT’。

设置方法:

export POSIXLY_CORRECT=TRUE
取消设置:

unset POSIXLY_CORRECT
例如:df命令(报告文件系统的磁盘使用情况)输出在 POSIX 标准下和 GNU 下是不同的。要使系统 GNU utilities 完全遵从 POSIX 标准,可以设置环境变量’POSIXLY_CORRECT’。

POSIX 细节:

输出结果在缺省时以 512 字节为计数单位,若给以 -k 选项,则以 1024 字节为计数单位。

GNU 细节:

(在没有用选项指定计数单位的情况下)输出结果以 1024 字节为计数单位,但不包括由于设置了环境变量’POSIXLY_CORRECT’而跟从 POSIX 标准的情况。

清单 1. df 命令输出

# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 70675484 9834248 57251112 15% /
# export POSIXLY_CORRECT=True
# df
Filesystem 512B-blocks Used Available Use% Mounted on
/dev/sda1 141350968 19668496 114502224 15% /
# df –k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 70675484 9834248 57251112 15% /
# unset POSIXLY_CORRECT

# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 70675484 9834248 57251112 15% /
Linux 系统的不同版本采用了不同版本的POSIX标准,如 RedHat3,4系统采用的是旧版本 POSIX 标准 1003.2-1992,RedHat5 采用的是新版本 POSIX 标准 1003.1-2001,新旧版本的 POSIX 标准在一些地方有不兼容情况存在。

GNU utilities 通常遵从的 POSIX 版本就是系统所在的 POSIX 版本。RedHat5 GNU utilities 采用的是新的 POSIX 版本,RedHat3,4 采用的是旧的 POSIX 版本,由于 POSIX 新旧版本之间有不兼容存在,导致一些在 RedHat3,4 上运行良好的应用程序和脚本直接移植到 RedHat5 上不能正常运行行。

比如,’tail +2 ’这个命令在旧版本 POSIX 上的意思是得到文件从第二行到末尾的内容,但是从新的 POSIX 版本 1003.1-2001 开始,这个命令的意思变成了得到文件’+2’的内容,如果你想得到真正文件的内容,就得改用命令’tail –n +2 ’。

清单 2. 文件 wln.txt 内容

# more wln.txt
It is sunny today,
you are an industrious boy,
give the room a good sweep
这是用于下面tail命令示例的文件。

清单 3. 在旧版本POSIX上运行

# tail +2 wln.txt
you are an industrious boy,
give the room a good sweep.
旧版本POSIX用’tail +2’可以正确显示文件前两行内容。

清单 4. 在新版本POSIX上运行

# tail +2 wln.txt
tail: cannot open `+2` for reading: No such file or directory
==> wln.txt <==
It is sunny today,
you are an industrious boy,
give the room a good sweep.
# tail –n +2 wln.txt
you are an industrious boy,
give the room a good sweep.
新版本POSIX用’tail +2’命令不能正确显示文件前两行内容,必须用’tail –n +2’命令才行。

为 了解决不同版本的 POSIX 标准的兼容性问题,使得 GNU utilities 能和不同版本的 POSIX 标准工作,Linux 系统引入了环境变量’_POSIX2_VERSION’,这个变量的格式是 YYYYMM,表示 POSIX 标准采用的年代和月份。

当前’_POSIX2_VERSION’有两个值:

‘199209’ 代表 POSIX 1003.2-1992

‘200112’ 代表 POSIX 1003.1-2001

设置用法:

export _POSIX2_VERSION=199209
取消设置:

unset _POSIX2_VERSION
如果你有旧版本的应用程序和脚本想移植到采用新版本 POSIX 标准的系统上运行,比如’tail +10’,’sort +1’等,你就能通过设置环境变量’_POSIX2_VERSION=199209’来解决兼容性。

清单 5. 使用’_POSIX2_VERSION’环境变量

# tail +2 wln.txt
tail: cannot open `+2` for reading: No such file or directory
==> wln.txt <==
It is sunny today,
you are an industrious boy,
give the room a good sweep.
# export _POSIX2_VERSION=199209
# tail +2 wln.txt
you are an industrious boy,
give the room a good sweep.
引入’_POSIX2_VERSION’变量后,’tail +2’能够正确显示文件前两行了。





回页首


本文讲述了Linux系统下的两个环境变量解决兼容性问题的方法。Linux是个开源的系统,通过这两个环境变量的使用,提高了应用程序在不同Linux版本之间的移植性。





回页首


  • GNU官方网站:
  • POSIX标准概述:



王丽娜,中国软件开发中心 Tivoli 部门软件工程师,负责 IBM 产品TMF(Tivoli Management Framework)的维护和客户支持工作,热爱 Linux。


阅读(1708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~