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

在一些情况下,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 <filename>’这个命令在旧版本 POSIX 上的意思是得到文件从第二行到末尾的内容,但是从新的 POSIX 版本 1003.1-2001 开始,这个命令的意思变成了得到文件’+2’的内容,如果你想得到真正文件的内容,就得改用命令’tail –n +2 <filename>’。

清单 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版本之间的移植性。

Linux 技巧:谈 Linux GNU 实用工具兼容性相关推荐

  1. 你要了解的11款面向Linux系统的一流备份实用工具

    个人计算机或者服务器上的备份对于防止数据丢失很重要.系统管理员每天需要处理大量的企业级数据,甚至个人计算机上的数据,所以要深入了解不同的备份工具. 经常备份计算机上的数据是个好的做法,它可以手动完成, ...

  2. [翻译]pb技巧、代码和实用工具[程序员家园论坛]

    [翻译]pb技巧.代码和实用工具      原文: http://www.softtreetech.com/hightech/tips.htm      pb技巧.代码和实用工具      内容列表: ...

  3. Linux运维13款实用工具

    本文介绍几款Linux运维比较实用的工具,希望对Linux管理员有所帮助. 1.查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. ...

  4. 在 Linux 下安装 GNU ARM 工具链

    可以使用多种工具编写不同版本的 ARM 内核,但最流行的一组工具是 GNU ARM 工具链.更多地了解如何使用 ARM 内核进行嵌入式开发,以及如何安装并使用 GNU 工具. 如果您对在最普遍的微处理 ...

  5. Linux 技巧: 从命令行创建像素标尺

    如何使用 Bash 脚本.shell 算法和 ImageMagick 在图像上绘制线条和文本 学习如何使用 Linux® 命令行和一些基本的 Bash 脚本编写技巧,以便使用 ImageMagick ...

  6. Perf -- Linux下的系统性能调优工具,第 2 部分

    https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ Perf -- Linux下的系统性能调优工具,第 2 部分 刘 明, 软件工程师, 上 ...

  7. 浅谈 Linux 内核开发之网络设备驱动[转]

    本文来自:http://www.ibm.com/developerworks/cn/linux/l-cn-networkdriver/ 网络设备介绍 网络 设备是计算机体系结构中必不可少的一部分,处理 ...

  8. 技巧:Linux 动态库与静态库制作及使用详解

    http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/ 技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用 ...

  9. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )

    一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...

最新文章

  1. docker 从harbor 拉取镜像慢_Harbor丨使用的正确姿势
  2. Java程序员必备秘籍 Scala与Clojure函数式编程语言
  3. 当人类与「熵」对抗时,意识出现了!那AI呢?
  4. 在linux下给grep命令添加颜色
  5. iOS开发UI篇—UITableviewcell的性能优化和缓存机制
  6. 根据关键字检索相关视频
  7. 庆祝Dojo中文博客成为CSDN博客专家!
  8. IsDlgButtonChecked()
  9. 随手记录自动化常用的一些事情
  10. cudaMemset的调用方式
  11. SQL Server着眼于非数字数据类型
  12. 黑马博客——详细步骤(十)项目功能的实现之开发环境与生产环境
  13. 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享 - pytorch中文网...
  14. 手动安装Ubuntu 16.04无线wifi驱动,任意网卡型号均可
  15. Python函数总结大全(函数定义,参数种类、返回值等)
  16. mysql读写分离ppt_MYSQL主从复制和读写分离ppt课件
  17. 戒指戴在不同手指上的含义
  18. jzoj 4813. 【NOIP2016提高A组五校联考2】running
  19. 如何获取广告服务流量变现数据,助力广告效果分析?
  20. 动态磨砂玻璃渐变背景

热门文章

  1. python爬虫能干什么-Python爬虫能做什么
  2. 不是python中用于开发用户界面的第三方库-模拟试卷C
  3. python难学嘛-终于明白0基础学python难吗
  4. 学会python爬虫怎么赚钱-学会Python爬虫能赚大钱吗?Python爬虫赚钱渠道分享
  5. python 命令行参数-python实现读取命令行参数的方法
  6. python中需要用到的英文词汇-使用python从语料库中提取最常用的单词
  7. Git Bash命令行基础
  8. windows命令行帮助文档如何使用
  9. python读取有中文文件时的报错处理
  10. 利用 test 命令的测试功能