linux shell的函数名与命令名相同时的问题

Life is short , play more!
本文来自lihao's Blog,转载请注明。

前些日起,帮同事看一个编译android系统原生代码时的问题.

当时的问题再现:
1. 在一个ssh进程中,source了envsetup后.
2. 在另外一个ssh进程中,想执行lunch方法. 结果command not found .  就是因为这个同学没有意识到我换了一个ssh, 所以碰巧出现了问题.
3. 然后就去搜索lunch 命令了. 对于不熟悉android编译的同学肯定会去这么做.

我也没经验,所以发现下载了lunch命令后,(没想到还真有这个lunch 软件), 但是不是我们期望的命令阿. 所以很郁闷,这是为什么呢? 搜索了下lunch命令相关资料,非常少. 由搜索了下关于android代码编译的文章, 有一篇提到,使用lunch 函数去选择平台等. 恍然大悟, lunch是一个shell 函数. 而不是一个linux 命令. 所以,回过头去看envsetup.sh, 发现里面果然定义了一个lunch 的方法. 那么简单了, 显而易见,我们执行了source envsetup.sh 后, 没有在本session中执行lunch, 所以当然找不到lunch 了.

问题解决了.我们再想另外一个问题,如果一个shell 的function和一个linux 命令名字一样,那是怎么样的情况呢?

1. 当shell function 名字与linux 命令一致时,会先调用function 函数.

例如shell test.sh如下
function ls {
/bin/ls/ -al /root/
}

#我先执行 source test.sh
#再执行ls
该ls执行的是test.sh 中的ls 函数.

ps: 如果函数里又要调用相同名字的命令时,一定要注意. 命令一定要指定路径, 或者指出是使用command而不是再调用function, 否则就会陷入死循环!!


发表评论

电子邮件地址不会被公开。 必填项已用*标注