以前研究Windows的基本概念时,我就知道它有一个POSIX子系统,可以在Windows下编译运行使用了POSIX库的程序。但这一直停留在书本概念层面,直到昨天看到Jeep同学的Windows系统上安装了一个Subsystem for UNIX-based Applications时,我便决定也安装试用一下。
有关Windows的POSIX子系统是什么、怎么用的问题,可以参考Wikipedia或Microsoft TechNet [英文][中文]上的介绍。它历经了NT时代的Microsoft POSIX subsystem、XP/2000时代的Microsoft Windows Services for UNIX (SFU)以及2003 R2/Vista/2008时代的Subsystem for UNIX-based Applications (SUA)等版本,对POSIX标准的支持日臻完善。我的系统是来自MSDNAA/IEEE的Windows Server 2008,自然要使用最新版的SUA。至于SUA和cygwin在实现机理和功能性能上有什么区别,我还没有仔细研究。但从直观感觉上,Windows原生支持的SUA是比cygwin快一点儿;按照Wikipedia上的这个说法,cygwin是对POSIX是“partial”兼容,而SFU/SUA则是“full”兼容。
很多人安装SUA的目的并不是要向Windows移植什么重要的UNIX/Linux应用,有时候我们仅仅是为了在Windows中使用一个类UNIX的Shell以及丰富的GNU utilities,毕竟这类久经考验的命令行工具比Windows Command Prompt的那些命令好使很多。对于工作环境要求在Windows和Linux间来来回回切换的人们,也省得敲错命令。安装SUA之后,预装的Shell是C Shell和Korn Shell,还安装了包括vi、gcc在内的300多个命令行工具。同时,Windows的Path环境变量中自动添加了SUA相关目录,这样在Windows Command Prompt和Power Shell中也可以使用很多GNU utilities了。当然,UNIX Shell的内部命令是不可以在这里使用的。此外,在Power Shell中,Power Shell命令别名(如ls、cp)会优先于同名的GNU utilities调用。总之,使用SUA或cygwin这类UNIX Shell+GNU utilities的模拟环境,相比手工添加的“容错”命令或者GnuWin32这类独立命令级的移植要“真实”和顺手得多,但缺点就是体积庞大。
为了检验SUA的能力,我拿我相对熟悉的GNU bash做了实验。从官方下载bash-4.0版源代码,在SUA的C Shell环境中解压,运行./configure通过。但在make时报错:

  1. execute_cmd.c: In function `time_command':
  2. execute_cmd.c:1145: error: storage size of `dtz' isn't known

查看execute_cmd.c源代码,发现这句代码有注释:

  1. struct timezone dtz; /* posix doesn't define this */

看来这个struct timezone不是POSIX标准的东西。通过上下文,我发现这里是处理time(计时)关键字的函数。于是查看configure的帮助,得知只要加一个“--disable-command-timing”参数即可禁用time关键字(这时输入time将改用/bin/time程序做计时)。再次make,execute_cmd.c通过,但又出现以下错误:

  1. getcwd.c: In function `_path_checkino':
  2. getcwd.c:80: error: `MP_RMDOT' undeclared (first use in this function)
  3. getcwd.c:80: error: (Each undeclared identifier is reported only once
  4. getcwd.c:80: error: for each function it appears in.)

查看./lib/sh/getcwd.c的源代码,果然没有找到MP_RMDOT宏的定义。在全部源代码中搜索,发现这一定义在externs.h中,在./lib/sh/makepath.c中也有使用,唯独在./lib/sh/getcwd.c中使用了却没有引用其定义。也许这是bash-4.0的一个bug?使用Linux下的gcc编译连接是通过的,但SUA下的gcc版本也许有更严格的名字连接策略,导致无法编译通过。于是我将“#define MP_RMDOT 0x04”的定义手工加入./lib/sh/getcwd.c,再次make,全部通过。实验运行无误!
需要注意的是,SUA提供的是编译和运行使用了POSIX库的程序的环境,并不提供UNIX二进制文件的运行支持。它编译生成和支持运行的可执行文件仍然是Windows的PE格式,而不是ELF之类。SUA支持的只是仅使用了标准库和POSIX库的程序的源代码级移植,对于使用了Linux等环境特有的系统调用的程序,也不可能不加修改地编译运行。
有空再研究一下SUA在我们的工程中能有什么实际点的应用。

转载于:https://blog.51cto.com/activethink/232462

SUA 编译 BASH相关推荐

  1. history linux 日志服务器_编译bash实现history的syslog日志记录

    一.编译BASH实现bash的syslog日志记录功能 1. 本文将通过bash软件实现history记录到syslog日志的功能,并通过该方式可以实现实时的传送到了远端的日志集中服务器上,可以实现操 ...

  2. centos 6.3_x64编译7.4 LFS

    1.1安装系统centos6.3-x86-64 1.2用剩余空间分区,本实验挂载分区为/dev/sda4,swap分区/dev/sda3 (注:如果用LIVECD,可以格式所有的硬盘,否则不是,提前预 ...

  3. LINUX编译OpenJDK 9

    比起初次编译顺利多了. 下载源码 Tags · openjdk/jdk9u · GitHub Tags · openjdk/jdk9 · GitHub 吾下载的是jdk-jdk-9-181.tar.g ...

  4. Bash漏洞那些事儿

    还记得Heartbleed漏洞吗?如果你相信今天这个铺天盖地的传言,那说明Shellshock和它是一类的,它的名字也同样令人畏惧(弹震症,一种精神疾病),就是缺了个酷点的LOGO而已(这些漏洞的市场 ...

  5. Bash审计与命令记录

    翻译原出处:www.pointsoftware.ch/de/howto-bash-audit-command-logger/ 翻译并整理了一下,水平有限,多请见谅. 有一个完整的输入命令记录在很多情况 ...

  6. SUA--Win7的有趣功能

    在win下面体验linux一般是使用cygwin,现在有新的选择了-SUA,或者说Subsystem for UNIX-based Applications 在控制面板选择程序和功能,然后选择功能,就 ...

  7. 在树莓派中开发 opencv 大型程序

    开发环境 因为树莓派的 cpu 和内存大小的限制,在树莓派上跑 IDE 不太可能,对于简单的程序,我们可以通过 bashgcc -o main main.cpp 完成小程序的编译过程.然而我们如果要开 ...

  8. cmake交叉编译android,CMake Android 交叉编译

    众所周知,AS现在可以利用Grandle调用cmake,实现c++代码在Android平台上的交叉编译.但是大多是情况下,项目代码不是从零开发,而是在现有代码的基础上移植到Android平台上.这种情 ...

  9. Linux运维人员共用root帐户权限审计

    在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度.不出问题还好,出了问题,就很难找出源头. 这里介绍下,如何利用编译bash 使不同的客户端在使用ro ...

最新文章

  1. ICLR 2017 | GAN Missing Modes 和 GAN
  2. check attribute active - how to check if SAP CRM WebClient UI property is read only
  3. C语言试题二十五之编写一个函数float function(double h),函数的功能使对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h中的值位正数)。
  4. python爬取苏州天气并用excel来保存
  5. 2021 ICPC Asia Jinan Regional Contest-J Determinant(取模高斯消元)
  6. Nginx集群之基于Redis的WebApi身份验证
  7. CSDB Blog快速备份程序-备份你自己的Blog
  8. 服务器 硬盘灯,硬盘灯一直亮,手把手教你电脑硬盘指示灯一直亮怎么办
  9. ADAMS 脚本仿真
  10. 如何更换ppt模板内容不变_怎么修改固定的ppt模板中的字和图片
  11. Python 自动刷新网页
  12. Vue事件修饰符.prevent .passive
  13. matlab如何进行四维拟合,matlab四维插值拟合
  14. word2007 去背景底色
  15. Quartus 实现D触发器及时序仿真
  16. 干货|23种最好用的3D打印软件工具
  17. logit方程怎么写_家长也能看懂的“一元一次方程解法”,请大家收藏给孩子看!...
  18. c++成员变量初始化
  19. 单反相机镜头的ldquo;三大纪律,八项注意rdquo;
  20. python文件名排序按windowsp_在SQLServer中如果实现Windows文件夹中按名称排序?算法是什么怎么Order By...

热门文章

  1. 亲测无限坐席在线客服系统源码,基于ThinkPHP的一款在线客服系统源码
  2. 更1多免费源码668源码网.html,某宝在线客服源码含详细教程
  3. 《融智学进阶文集》01:间接计算模型和间接形式化方法
  4. java excel解析:poi与jxl的区别(excel版本问题:xls,xlsx)
  5. Leetcode-974 和可被 K 整除的子数组
  6. 缺氧游戏超级计算机在哪里研究,缺氧简易上手攻略_缺氧怎么玩_游戏堡
  7. 开源私有云盘python_使用Seafile搭建个人专属私有云盘
  8. 千万别在朋友圈骂人,要被罚1000元!
  9. 无线AP的7种工作模式
  10. 自我修炼是优秀领导者的最高层次--张一鸣