ruby调用shell问题——找不到自己环境变量中的程序
来源:互联网 发布:离线搜题软件 编辑:程序博客网 时间:2024/05/21 05:20
问题来源
在linux,为了使用方便难免要把自己的程序的目录放到环境变量中(通过修改home目录下.profile ,.bash_pro, .bashrc 这种文件实现),在用kaldi的时候我也是这样。假设这个程序是 your_exe ,那么就可以在shell中像输入 mv,echo,ls等一样使用。
我们知道在ruby中调用一个shell命令可以使用 ``,system,%x[],exec等。 我们可以写类似的命令
`ll | awk '{print $0}' | echo `
这样是没问题的,然而我发现一个有趣的现象,它令我当天花费2h解决,但是无果,让我伤心至极
` your_exe ` 这样your_exe可以运行 至今我解释不了为什么这个可以运行
`cat file | egrep -v 'exp' | your_exe ` 居然提示your_exe找不到
(%x[] 与 ``作用类似,不过可以写多行)
解决之路
首先原因估计是是环境变量没有加载进来,但我的疑惑处在上面写出了。
1.考虑ruby运行时的环境 (错误思路)
我以为%x[] 这种调用方式使用的环境变量是ruby运行的环境变量,于是使用下面的方法
path="#{kaldipath}/src/bin/"$LOAD_PATH.unshift pathp $LOAD_PATH结果还是找不到
后来我明白原来调用系统命令的方式是另起进程,所以环境变量可能会改变。(只是猜测)
2.在%x[]中先加入环境变量
首先我这样做
%x[source ~/.profile]说是找不到source,联想起我之前探索的cd这个命令的问题,才知道cd,source,以及. (点) 这三个为系统级别的命令,根本没有实在的程序,shell遇到它们会做特殊的处理,一般只有sh脚本才能直接用。
在我感觉失望之余,我想到可以使用export PATH=$PATH:add_path,结果成功了。
3.优化
我想既然export可以不就可以直接把 .profile中的内容直接当成命令吗,于是就如下写
a=File.open("~/.profile").read%x[#{a}(test cmd line)]结果发现ruby不认识~符号,改了之后发现还是不行。这个错误找了很久最后我才发现原来那个文件里面有~这个符号,因此就只好设法替换大致如下
home_path=`echo -n ~`......a.gsub!(/~/,home_path)
最后总算可以了。
总结
任何事情都是熟能生巧吧,每个语言都有自己的问题,只有用的多了才知道,所以希望自己不要再被语言之争而弄的心烦意乱,学好(但不要刻意学)一个语言就可以了,毕竟语言不算什么。有些东西的确需要对系统有所了解才能少犯错误,或者犯了错误也能较快察觉。
- ruby调用shell问题——找不到自己环境变量中的程序
- shell中crontab报环境变量找不到问题
- [Ruby]调用外部程序
- Ruby 调用本地程序
- 程序调用mysql找不到mysql.sock的问题
- classpath环境变量问题——找不到或者无法加载主类或运行结果有误
- ruby中的一个问题
- Linux Shell中的变量-环境变量
- ruby调用执行shell命令的方法
- Linux下Ruby调用shell方法
- ruby shell 调用的六种方法
- Ruby中调用windows shell的方法
- crontab启动shell,环境变量问题
- linux环境c++程序调用shell返回值问题
- [Ruby] ruby中的拟态方法的调用中的小细节
- Bash Shell 实例 ——环境变量
- crontab中的环境变量问题
- crontab中的环境变量问题
- 学习网站
- 解决VirtualBox下安装虚拟机(Ubuntu)出错(不能为虚拟电脑Ubuntu打开一个新的任务)的问题
- Delete Node in a Linked List
- MYSQL之表分区----按日期分区
- HDU 1028 Ignatius and the Princess III
- ruby调用shell问题——找不到自己环境变量中的程序
- javassist学习三
- CodeChef COUNTARI Arithmetic Progressions FFT + 分块
- Objective-C 属性特性详解
- APP源码分享-你最美源码
- ubuntu14.04 64位 adb配置问题
- 连接数据库报“You have an error in your SQL syntax”异常的解决
- Quarzt 2D 裁剪
- 控制器添加控制器的view的方法