LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1219|回复: 12

如何让脚本常驻内存?

[复制链接]
发表于 2003-5-2 11:52:08 | 显示全部楼层 |阅读模式
正在写一个目录堆栈的脚本,想在控制台下实现窗口文件管理器中常见的“前进”“后退”目录导航功能,有一个问题:如何实现对控制台下用户目录操作的跟踪?也就是说这个脚本须常驻内存,我想到的方法是:使用

  1. while ture; do
  2.     sleep 1
  3. done
复制代码
的笨方法,用这个死循环每隔一秒扫描一次$PWD发现不同就入栈,但这个方法还是可能丢失用户目录操作而且也很浪费,不知还有什么更好的方法?
发表于 2003-5-2 12:34:28 | 显示全部楼层
难度够大的!
要想节约资源,提高运行速度,我一般采用把函数(脚本代码)放在ENV环境文件中的方法,这样他就不以文件的形式存在在磁盘中,而是当系统读取ENV文件时,自动把函数调入内存,也可以变相达到了常驻内存的目的,即调用他的时候不必每次引用,shell执行命令的顺序是:内置命令,函数,可执行程序,当然,把函数自动添加到内置命令中也是好办法...
不知道我理解的是否有误?
 楼主| 发表于 2003-5-2 18:44:27 | 显示全部楼层
呵呵,多谢javalee,又学了一招。
我想“函数自动添加到内置命令中也是好办法...”更有助于解决这个问题,不知如何实现?感觉不是脚本就能搞定的。
发表于 2003-5-2 18:57:01 | 显示全部楼层
对的,好像是这么一个过程,先用C写一个函数,如:a.c,然后用cc编译,产生一个目标文件a.o 再用ld 命令创建一个共享库,最后用builtin shell内建的命令注册,我也不十分清楚,还是看看书吧~~
 楼主| 发表于 2003-5-2 21:38:01 | 显示全部楼层

如何在脚本中操作环境变量?

想定义一个作用于console的全局变量,于是在.bash_profile中定义了一个变量export env=“ ”,我希望在脚本中对其赋值操作,并且env要记住在脚本中的赋值,因为下次执行该脚本时要根据上次的赋值进行相关操作。也不知我说清楚了没有?我发现在脚本中可以调用env的值,也能对它赋新值,但下次调用时还是.bash_profile中的初始值。请教javalee有何解决方法。
发表于 2003-5-2 22:26:50 | 显示全部楼层
不知道我理解得对不对?;)
我发现在脚本中可以调用env的值,也能对它赋新值,但下次调用时还是.bash_profile中的初始值。
这句实际上是环境变量和局部变量之间的关系,就是bashrc继承profile,也可以说是有些像父shell和子shell之间的继承与被继承的关系,你所说的可以对他进行赋新的值的操作,是在你当前基于这个脚本(局部)环境下,跟你在ENV(全局环境)那个赋值已经没有关系啦~,当你退出这个进程(脚本)时,他自动清除,环境变量和局部变量,就像函数,你在当前定义的函数,可以执行,如果你退出这个环境,那么他就不存在!除非你在ENV环境文件中定义,!
解决方法呢??----饶了我吧~~~
 楼主| 发表于 2003-5-2 22:44:57 | 显示全部楼层
翻了一下资料:.bash_profile中定义的变量是只在登录时初始化一次,在本次登录过程中全局有效。而.bashrc中定义的变量则对每个新开的shell进程都重新初始化。更深入的解释没找到,如果javalee兄的理解是正确的,要实现我的想法,只能用生成记录文件的方法了,那可真不爽呀,呵呵,我希望javalee的理解是错的:p
发表于 2003-5-2 23:24:44 | 显示全部楼层
无论对错,我尽力啦~~,以后还要向LYOO请教,OK?!;)
 楼主| 发表于 2003-5-3 16:29:10 | 显示全部楼层
我使用的环境是bash 2.05a.0(1)-release

实验一
-------
为了使env全局可见(而不是在每个新的shell进程中重新初始化)
于是我在.bash_profile中加入
env="ok"
export env

现在我用如下的脚本对其进行检验
#!/bin/bash
echo $env
env="me"
echo "env now is $env"

执行脚本的结果是
ok
env now is me

由“ok”可见我已成功定义了全局变量(使用printenv也可以看到env=ok)
“env now is me”表明已在脚本中也能成功为env赋值。

理论上来说现在,现在如果用printenv或echo $env的结果应该是env=me,但实际结果是env=ok。

换一种方法,直接在shell提示符下执行env=me,然后使用printenv或echo $env,发现结果与预计的一致:env=me

实验二
------
写如下一个脚本
#!/bin/sh
X=15
export X
执行完该脚本之后,在shell下使用echo $X或printenv查看变量X并不存在。

由上述的实验,我得出的结论是:在bash中,环境中定义的全局变量在脚本中可读不可写,而脚本内定义的全局变量,在脚本外也是不可见的。
而我的希望是在环境中定义一个变量,然后使用脚本对其进行写操作。

不知我的理解是否正确?(我觉得是错的,因为这样export就毫无意义了,但不知错在哪)
 楼主| 发表于 2003-5-3 22:19:58 | 显示全部楼层
有了一定进展。
使用. ./abc.sh的方式来执行一个脚本是可以操作上述环境变量的,原理是在当前shell进程中操作环境变量。
但如何在子进程中操作环境变量,还没找到解决方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表