免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2297 | 回复: 11
打印 上一主题 下一主题

关于shell函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-30 18:14 |只看该作者 |倒序浏览
写一个shell函数,使用. 函数名导入系统后,直接可以使用#函数名来调用,相当于执行一个以函数名为命令名的一个命令,这是通过什么原理来操作的,我给函数名一个可执行权限,然后在命令行却运行不了,为什么,set可以看到函数。请各位大大给个释疑,谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-03-30 19:47 |只看该作者

回复 #1 locale 的帖子

给个例子吧,比较形像一点,要不然我。。。我明白不了。

论坛徽章:
0
3 [报告]
发表于 2009-03-30 21:03 |只看该作者
鸡鸡哥怎么也问得这么含糊?

论坛徽章:
0
4 [报告]
发表于 2009-03-31 09:35 |只看该作者

回复 #3 haimming 的帖子

回复 #2 我是DBA 的帖子
回复 #3 haimming 的帖子
  1. [root@localhost:/test]# cat functions.main
  2. #!/bin/bash
  3. # name functions.main
  4. findit () {
  5. if [ $# -lt 1 ];then
  6.   echo "usage:findit file"
  7.   return 1
  8. fi
  9. for loop
  10. do
  11.   find / -name $1 -print
  12. done
  13. }
复制代码

以上为函数体,我自己添加了#!/bin/bash

  1. [root@localhost:/test]# . functions.main
复制代码

上面是把函数载入shell。
  1. [root@localhost:/test]# ./functions.main groups
  2. [root@localhost:/test]#
复制代码

上面是直接运行这个函数脚本什么结果也没有,为什么没有。
  1. [root@localhost:/test]# findit groups
  2. /usr/bin/groups
复制代码

上面可以运行并且有结果,但findit仅仅是个函数,通过. 函数名导入,使用set可以看到函数体,一般在最下面可以看到函数体。
问题是:
1.函数通过. 函数名导入shell后,是否就跟命令是等价的?
2.为什么我再函数上添加#!/bin/bash,运行不了,或者运行后没有结果反馈给我呢?
3.使用. 函数名把函数导入shell,这个工程是怎么走的,也就是说,为什么就能把函数当做命令使用了,跟path路径是否有关系,因为这个函数名也可以自动补齐。
谢谢。不知道这次说清楚了没有。

论坛徽章:
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
5 [报告]
发表于 2009-03-31 10:36 |只看该作者
你定义了函数没运行想要什么结果?

论坛徽章:
0
6 [报告]
发表于 2009-03-31 10:46 |只看该作者
原帖由 waker 于 2009-3-31 10:36 发表
你定义了函数没运行想要什么结果?

版主帮我详解一下

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
7 [报告]
发表于 2009-03-31 10:48 |只看该作者
原帖由 locale 于 2009-3-31 10:46 发表

版主帮我详解一下

建议了解下. 就是source命令

论坛徽章:
0
8 [报告]
发表于 2009-03-31 10:49 |只看该作者
原帖由 waker 于 2009-3-31 10:36 发表
你定义了函数没运行想要什么结果?

在shell中使用函数
当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入s h e l l。
文件头应包含语句# ! / b i n / s h,文件名可任意选取,但最好与相关任务有某种实际联系。例
如,f u n c t i o n s . m a i n。
一旦文件载入s h e l l,就可以在命令行或脚本中调用函数。可以使用s e t命令查看所有定义
的函数。输出列表包括已经载入s h e l l的所有函数。
如果要改动函数,首先用u n s e t命令从s h e l l中删除函数,尽管u n s e t删除了函数以便于此函
数对于s h e l l或脚本不可利用,但并不是真正的删除。改动完毕后,再重新载入此文件。有些
s h e l l会识别改动,不必使用u n s e t命令,但为了安全起见,改动函数时最好使用u n s e t命令。

我是这么做的啊

论坛徽章:
0
9 [报告]
发表于 2009-03-31 10:50 |只看该作者
[root@localhost:/test]# ./functions.main groups
[root@localhost:/test]#

functions.main作为脚本来运行,如斑斑所说,你这个脚本中并无运行函数的语句,所以没输出
---------------------
[root@localhost:/test]# findit groups
/usr/bin/groups

因为你事先运行过. 函数名,即source 函数名,shell环境中已有该函数,findit groups作为函数运行,有结果

另附man source
source filename [arguments]
              Read and execute commands from filename in  the  current  shell
              environment  
and return the exit status of the last command exe-
              cuted from filename.

[ 本帖最后由 ywlscpl 于 2009-3-31 10:52 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-03-31 10:52 |只看该作者
原帖由 HH106 于 2009-3-31 10:48 发表

建议了解下. 就是source命令

晕,算了,继续看书,也许后面就明白了,目前的知识不够我理解函数的概念,看完了也许就通了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP