LinuxSir.cn,穿越时空的Linuxsir!

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

问一个bash脚本的问题[已解决]

[复制链接]
发表于 2004-12-17 18:54:56 | 显示全部楼层 |阅读模式
bash脚本如何判断自己是在登录的交互式shell还是非交互式shell下执行的?
这个问题的起因是我装了matlab 7,发现在shell里执行matlab正常,
但是在KDE的konqueror里直接点击matlab执行,matlab的图形窗口
一闪就退出了。
我修改matlab的脚本,把环境变量输出。对比两种情况,没有发现什么不同。
那么为什么第二种方式不能正确执行呢?
发表于 2004-12-17 22:16:50 | 显示全部楼层

回复: 问一个bash脚本的问题

最初由 chiefmonk 发表
bash脚本如何判断自己是在登录的交互式shell还是非交互式shell下执行的?
这个问题的起因是我装了matlab 7,发现在shell里执行matlab正常,
但是在KDE的konqueror里直接点击matlab执行,matlab的图形窗口
一闪就退出了。
我修改matlab的脚本,把环境变量输出。对比两种情况,没有发现什么不同。
那么为什么第二种方式不能正确执行呢?


我没有用过matlab,但我对明白用matlab写的脚本和别的程序解释执行的脚本没有什么区别。
bash脚本不会判断自己在哪种形式的shell执行,在图形上点击程序运行,会直接运行该程序,若程序没有设定用户输入策略,执行完程序后就退出了,程序执行得到的输出若没有被重定向到文件的话将会全部丢失。
而在交互式shell中,用户指定运行一个程序,shell去请求内核执行该程序,而shell转入休眠直至请求程序结束,而该程序输出会打印在屏幕上(若没有重定向的话)。

兄弟此种情况我认为应当在你写的脚本中找问题。

PS:chiefmonk兄实在对不起,我误操作把编辑当成回帖,编辑了你的帖子,但我未改动兄弟的帖子,实在抱歉,望见谅
 楼主| 发表于 2004-12-18 09:41:51 | 显示全部楼层
谢谢版主的回答。现在我分析了一下脚本,把它简化成如下形式:
#!/bin/bash
export LD_LIBRARY_PATH=/home/lcj/app/matlab/sys/os/glnx86:/home/lcj/app/matlab/bin/glnx86:/home/lcj/app/matlab/extern/lib/glnx86:/home/lcj/app/matlab/sys/java/jre/glnx86/jre1.4.2/lib/i386/native_threads:/home/lcj/app/matlab/sys/java/jre/glnx86/jre1.4.2/lib/i386/client:/home/lcj/app/matlab/sys/java/jre/glnx86/jre1.4.2/lib/i386:/usr/lib:/home/lcj/app/matlab/sys/opengl/lib/glnx86
/home/lcj/app/matlab/bin/glnx86/MATLAB
其中/home/lcj/app/matlab/bin/glnx86/MATLAB是ELF可执行程序。
上述脚本,在xterm里输入,matlab可以正确执行。但是在konqueror里直接点击,问题依旧。似乎在这种方式下MATLAB程序没有取得LD_LIBRARY_PATH的内容。
发表于 2004-12-18 10:07:58 | 显示全部楼层
可以判断啊
  1. #echo $-
复制代码

输出结果有i就表示是交互式shell啊
看我的输出
  1. # echo $-
  2. himBH
复制代码

具体的判定只要用case就行乐
  1. case $- in
  2. *i*)statements fo interactive shell
  3. ;;
  4. *)statements for noninteractive shell
  5. ;;
  6. esac
复制代码
发表于 2004-12-18 11:39:04 | 显示全部楼层
是的, shell是可以判断自己的执行环境的! 你甚至可以设定自己的脚本运行在交互式shell下运行(-i), 但那没有什么大意义. 只是程序是点击执行或是在terminal中执行倒是不会改变程序的执行环境...
发表于 2004-12-18 12:00:02 | 显示全部楼层
最初由 chiefmonk 发表
谢谢版主的回答。现在我分析了一下脚本,把它简化成如下形式:
#!/bin/bash
export LD_LIBRARY_PATH=/home/lcj/app/matlab/sys/os/glnx86:/home/lcj/app/matlab/bin/glnx86:/home/lcj/app/matlab/extern/lib/glnx86:/home/lcj/app/matlab/sys/java/jre/glnx86/jre1.4.2/lib/i386/native_threads:/home/lcj/app/matlab/sys/java/jre/glnx86/jre1.4.2/lib/i386/client:/home/lcj/app/matlab/sys/java/jre/glnx86/jre1.4.2/lib/i386:/usr/lib:/home/lcj/app/matlab/sys/opengl/lib/glnx86
/home/lcj/app/matlab/bin/glnx86/MATLAB
其中/home/lcj/app/matlab/bin/glnx86/MATLAB是ELF可执行程序。
上述脚本,在xterm里输入,matlab可以正确执行。但是在konqueror里直接点击,问题依旧。似乎在这种方式下MATLAB程序没有取得LD_LIBRARY_PATH的内容。


我认为在matlab程序运行时变量LD_LIBRARY_PATH是有效的,若兄弟希望,可以简单作个测试,在执行matlab程序之前将变量LD_LIBRARY_PATH用
  1. echo $LD_LIBRARY_PATH > ./1.txt
复制代码

重定向到某个文件中,看是否得到正确的值

最初由 nait 发表
可以判断啊

源码:#echo $-


输出结果有i就表示是交互式shell啊
看我的输出

源码: # echo $-
himBH


具体的判定只要用case就行乐

源码:case $- in
*i*)statements fo interactive shell
;;
*)statements for noninteractive shell
;;
esac



还是兄弟厉害
我查找一下资料之后发现的确如此,不过我还是希望能补充一下:
变量$-不是在所有shell脚本中都有效,经过我机器上的测试几种流行的shell中:tcsh & csh是无效的,bash & ksh是有效的,但输出的值不同:
bash : 交互输出为:himBH, 非交互输出为:hB(可执行程序调用输出也为hB)
ksh:交互输出为:ims,非交互输出为:hB,可执行程序调用输出为:hBc

ps:我除了在直接运行shell这一非交互形式中测试,还在c语言嵌入脚本中作了测试

也就是说,不是所有的shell都能判断自己的运行环境。

这样除了nail兄的判断方法可用之外,还可用非交互输出值都以hB开头作为判断

另外楼主主要是用在bash脚本中,上面已经说了,应该可满足楼主要求了
发表于 2004-12-18 12:07:14 | 显示全部楼层
倒霉,最近学校的烂网其慢无比,老是断断续续,发多了帖子,也没变法删除,实在不好意思
发表于 2004-12-18 13:17:31 | 显示全部楼层
最初由 kiron 发表
我认为在matlab程序运行时变量LD_LIBRARY_PATH是有效的,若兄弟希望,可以简单作个测试,在执行matlab程序之前将变量LD_LIBRARY_PATH用
  1. echo $LD_LIBRARY_PATH > ./1.txt
复制代码

重定向到某个文件中,看是否得到正确的值




还是兄弟厉害
我查找一下资料之后发现的确如此,不过我还是希望能补充一下:
变量$-不是在所有shell脚本中都有效,经过我机器上的测试几种流行的shell中:tcsh & csh是无效的,bash & ksh是有效的,但输出的值不同:
bash : 交互输出为:himBH, 非交互输出为:hB(可执行程序调用输出也为hB)
ksh:交互输出为:ims,非交互输出为:hB,可执行程序调用输出为:hBc

ps:我除了在直接运行shell这一非交互形式中测试,还在c语言嵌入脚本中作了测试

也就是说,不是所有的shell都能判断自己的运行环境。

这样除了nail兄的判断方法可用之外,还可用非交互输出值都以hB开头作为判断

另外楼主主要是用在bash脚本中,上面已经说了,应该可满足楼主要求了
对斑竹穷追猛打,死缠烂打的敬业精神表示佩服:p :p :p
小弟可怜,至今只用过bash
更没有耐心去一个一个测试

我只知道csh用来做交互式shell是很优秀的
用来执行脚本的恐怕不多吧
多数的脚本都是为bourne shell编的,包括系统的启动脚本
 楼主| 发表于 2004-12-18 14:33:22 | 显示全部楼层
确实可以得到正确的值。
根据大家的讨论,我在export LD_LIBRARY_PATH=...前加了
set +i欺骗matlab。但是结果仍然相同,看来matlab不是这样判断的。

最初由 kiron 发表
我认为在matlab程序运行时变量LD_LIBRARY_PATH是有效的,若兄弟希望,可以简单作个测试,在执行matlab程序之前将变量LD_LIBRARY_PATH用
  1. echo $LD_LIBRARY_PATH > ./1.txt
复制代码

重定向到某个文件中,看是否得到正确的值
发表于 2004-12-18 14:37:13 | 显示全部楼层
最初由 nait 发表
对斑竹穷追猛打,死缠烂打的敬业精神表示佩服:p :p :p
小弟可怜,至今只用过bash
更没有耐心去一个一个测试

我只知道csh用来做交互式shell是很优秀的
用来执行脚本的恐怕不多吧
多数的脚本都是为bourne shell编的,包括系统的启动脚本


bourne shell虽然很多人用,但是它只是Linux的标准shell
在众多的Unix厂商及发行版中,所采用的shell可能未必是bourne shell,也有可能是bourne shell的变体,或采用其他的ksh,csh等等。实际运用中还是谨慎测试为好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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