免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1959 | 回复: 7

一个百思不得其解的函数引用问题 [复制链接]

论坛徽章:
0
发表于 2005-02-16 15:41 |显示全部楼层
我常常会发现写的函数在不明原因下会无法引用,但如果重建一个脚本引用的话并没有什么问题,这个情况一般在我写大型shell的时间会出现,每次都找不到原因,现象是说函数没有发现,提示为:
Programs/Create.sh[213]: func_Assign:  not found.
我想知道shell的函数在使用中有什么限制。

我的使用方法应该没问题吧,如下
functions.sh
aa() {
echo $1
}

main.sh
sh functions.sh
aa hello

如果是全新的脚本,上面这样就没问题,可是如果我在一个长长的shell中引用,就可能会发现无法调用的问题,郁闷死了。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2005-02-16 15:53 |显示全部楼层

一个百思不得其解的函数引用问题

. functions.sh
aa hello

论坛徽章:
0
发表于 2005-02-16 17:40 |显示全部楼层

一个百思不得其解的函数引用问题

我失败,果然是这个问题
那么,回到基础上来吧,请问sh main.sh和. main.sh有什么区别?
为什么我用sh main.sh也能执行程序,用. 也是执行呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-02-16 17:42 |显示全部楼层

一个百思不得其解的函数引用问题

原帖由 "hawkli" 发表:
我失败,果然是这个问题
那么,回到基础上来吧,请问sh main.sh和. main.sh有什么区别?
为什么我用sh main.sh也能执行程序,用. 也是执行呢?

呵呵,看看置顶shell十三问吧~~  

论坛徽章:
0
发表于 2005-02-16 22:25 |显示全部楼层

一个百思不得其解的函数引用问题

原帖由 "hawkli" 发表:
nc_Assign:  not found.
我想知道shell的函数在使用中有什么限制。

我的使用方法应该没问题吧,如下
functions.sh
aa() {
echo $1
}

main.sh
sh functions.sh
aa hello

如果是全新的脚本,上面这样?.........



从main.sh里引用functions.sh里的函数,应该在main.sh里用
.  functions.sh 导入吧?可以用sh functions.sh么?

论坛徽章:
0
发表于 2005-02-16 22:39 |显示全部楼层

一个百思不得其解的函数引用问题

原帖由 "hawkli" 发表:
我失败,果然是这个问题
那么,回到基础上来吧,请问sh main.sh和. main.sh有什么区别?
为什么我用sh main.sh也能执行程序,用. 也是执行呢?


最好用 "." 吧,那样可以避免一些环境变量问题。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-02-17 00:48 |显示全部楼层

一个百思不得其解的函数引用问题

原帖由 "egghead0" 发表:


最好用 "." 吧,那样可以避免一些环境变量问题。

为什么不把netman的shell十三问多看看?

论坛徽章:
0
发表于 2005-02-17 11:54 |显示全部楼层

一个百思不得其解的函数引用问题

十三问有关此问题的出处是这样写的:
因為,一般我們跑的 shell script 是用 subshell 去執行的。
從 process 的觀念來看,是 parent process 產生一個 child process 去執行,
當 child 結束後,會返回 parent ,但 parent 的環境是不會因 child 的改變而改變的。
所謂的環境元數很多,凡舉 effective id, variable, workding dir 等等...
其中的 workding dir ($PWD) 正是樓主的疑問所在:
當用 subshell 來跑 script 的話,sub shell 的 $PWD 會因為 cd 而變更,
但當返回 primary shell 時,$PWD 是不會變更的。  


能夠了解問題的原因及其原理是很好的,但是?如何解決問題恐怕是我們更感興趣的﹗是吧?^_^
那好,接下來,再讓我們了解一下 source 命令好了。
當你有了 fork 的概念之後,要理解 source 就不難:
* 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。
由於所有執行結果均於當前 shell 內完成,若 script 的環境有所改變,當然也會改變當前環境了﹗
因此,只要我們要將原本單獨輸入的 script 命令行變成 source 命令的參數,就可輕易解決前例提到的問題了。
比方說,原本我們是如此執行 script 的:
代码:
./my.script

現在改成這樣即可:
代码:
source ./my.script
或:
. ./my.script


反复咬文嚼字,关键也就是这一段了
* 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行

也就是说用sh function.sh的方式运行的是子程序,运行完毕以后所有的环境参数变量都不会影响父程序的,用. function.sh的方式则会影响。所以如果要在你程序中引用函数,必须把函数主体引入,而不是执行完毕就把这个函数扔掉,所以应该用. function.sh
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP