/usr/bin/cd 是什么鬼
上文中曾讲到,我在我的 Mac 上发现很多和 Bash 内部命令同名的外部命令,在那 24 个外部命令中,我发现个奇怪的现象:它们中有 15 个居然是 Shell 脚本,更奇怪的是,居然是同一个 Shell 脚本的硬链接:
|
$ find /usr/bin -inum 376183 /usr/bin/alias /usr/bin/bg /usr/bin/cd /usr/bin/command /usr/bin/fc /usr/bin/fg /usr/bin/getopts /usr/bin/hash /usr/bin/jobs /usr/bin/read /usr/bin/type /usr/bin/ulimit /usr/bin/umask /usr/bin/unalias /usr/bin/wait |
看看脚本的内容:
|
$ cat /usr/bin/cd #!/bin/sh # $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $ # This file is in the public domain. builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"} |
脚本只有一行,它的作用是什么?我分析了一下,当用户正常输入一个内部命令比如说 cd 时,Shell 肯定会把它当成内部命令执行,只有用户不小心把 cd 输入成 CD,由于 Mac 的文件系统不区分大小写,Shell 才会去执行这个外部的脚本。这个脚本拿到 $0 的值,也就是 /usr/bin/CD,砍掉路径,然后把大小字母替换成小写,也就是 cd,然后去执行 cd,同时带上参数。但我有几点想不通,这里的 builtin 完全是多余的,${1+"$@"} 也完全可以简写成 "$@",最重要的是,执行这些脚本是几乎没有任何意义的,因为 Shell 脚本是在当前 Shell 进程的新起的 Shell 进程里执行的,也就是说执行 CD / 相当于执行 bash -c 'cd /',当前 Shell 的工作目录其实并没有改变,除了 cd,其他命令也一样,虽然执行了,但完全没用,我再用 alias 和 unalias 演示一下:
|
$ alias 'll=ls -l' $ Alias $ Unalias ll /usr/bin/Unalias: line 4: unalias: ll: not found $ alias alias ll='ls -l' |
这么做的出发点是什么,输入 CD 应该报错才对啊,不报错反而执行了没效果,多让人困惑的行为。
于是我在网上查了一下,发现一篇日语的文章详详细细的介绍了这个脚本的来龙去脉。原来这个脚本存在的原因是:POSIX 标准要求操作系统要提供这 14 个内部命令对应的外部命令,以便 env、find、nice、nohup、time、xargs 这几个外部命令调用,比如 env cd。POSIX 又为什么这么规定,那就不知道了,但的确没卵用啊,怪不得 Linux 就没有遵守这个规范。
最初这个脚本诞生于 FreeBSD 上,为什么加上 builtin 和用 ${1+"$@"} 都是因为 FreeBSD 操作系统的原因,那篇文章有讲。还有最初的脚本是没有 tr \[:upper:] \[:lower:] 这一部分的,FreeBSD 上不需要这个,苹果移植的时候考虑到自己的文件系统不区分大小写,故意做了改良。
/usr/bin/cd 是什么鬼的更多相关文章
- linux /usr/bin/ld cannot find 解决
问题: 在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source ...
- linux /usr/bin/ld: cannot find -lxxx
在linux环境编译应用程式或lib的source code时出现如下错误:/usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的source code 而有不同的 ...
- 关于usr/bin/ld: cannot find -lxxx问题总结
/usr/bin/ld: cannot find -lxxx问题总结 linux下编译应用程序常常会出现如下错误: /usr/bin/ld: cannot find -lxxx ...
- innobackupex:Error:xtrabackup child process has died at /usr/bin/innobackupex
使用innobackupex进行数据库备份,报如下错误:innobackupex --compress --parallel=4 --user=root --password=yoon /expo ...
- 【转】关于usr/bin/ld: cannot find -lxxx问题总结
原文网址:http://eminzhang.blog.51cto.com/5292425/1285705 /usr/bin/ld: cannot find -lxxx问题总结 linux下编译应用 ...
- 【转】linux /usr/bin/ld cannot find 解决
原文网址:http://blog.csdn.net/mzwang123/article/details/6702889 问题:在linux环境编译应用程式或lib的source code时常常会出现如 ...
- make报错:"/usr/bin/ld: cannot find -lXXX"
在编译php时报错如下: # make ... /usr/bin/ld: cannot find -lltdlcollect2: ld returned 1 exit statusmake: *** ...
- cuda8.0 /usr/bin/ld: cannot find -lGL
/usr/bin/ld: cannot find -lGL collect2: ld returned 1 exit status tennycent@tennycent-desktop:~/$ ...
- (转载)关于usr/bin/ld: cannot find -lxxx问题总结
usr/bin/ld: cannot find -lxxx问题总结 linux下编译应用程序常常会出现如下错误: /usr/bin/ld: cannot find -lxxx 意思是 ...
随机推荐
- LLVM 笔记(五)—— LLVM IR
ilocker:关注 Android 安全(新手) QQ: 2597294287 LLVM 的 IR (Intermediate Representation) 是其设计中的最重要的部分.优化器在进行 ...
- Mac安装Windows 10的简明教程
每次在Mac上安装Windows都是一件非常痛苦的事情,曾经为了装Win8把整台Mac的硬盘数据都弄丢了,最后通过龟速系统恢复模式恢复了MacOSX(50M电信光纤下载了3天才把系统下载完),相信和我 ...
- 利用httpd对tomcat进行负载均衡配置
实验系统:CentOS 6.6_x86_64 实验前提:提前准备好编译环境,防火墙和selinux都关闭 实验说明:本实验共有2台主机,IP分配如拓扑 实验软件:jdk-8u60-linux-x64 ...
- 树莓派搭建ActiveMQ
树莓派上安装ActiveMQ和在其它Linux发行版基本相同,只是在开防火墙端口时有区别. 硬件信息: 树莓派3B型,Raspbian系统 安装 //下载ActiveMQ安装包 http:// ...
- 【2016-11-3】【坚持学习】【Day18】【ADO.NET 】
使用Connection创建数据库连接 使用Command创建命令 使用ExecuteScalar,ExecuteNonQuery,ExecuteReader方法来执行命令 使用DataReader来 ...
- POJ1112 Team Them Up![二分图染色 补图 01背包]
Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ...
- hibernate 数据处理
1.Hibernate的配置文件 Hibernate.cfg.xml Dept.hbm.xml 2.CRUD的方法名称和参数类型 Save(Object obj) Delete(Object obj) ...
- Unity Shader入门
Unity Shader入门 http://www.cnblogs.com/lixiang-share/p/5025662.html http://www.manew.com/blog-30559-1 ...
- SQLMAP参数介绍
转自:http://zhan.renren.com/bugpower?gid=3602888498044629629&checked=true SQLMAP参数介绍 sqlmap的使用方式:p ...
- fMRI: spatial smoothing
Source: Brain voyager support Theoretical Background Spatial smoothing means that data points are av ...