如何在Ruby中登录Shell环境执行命令并捕获输出?
在Ruby中以登录Shell执行命令并捕获输出
要让Ruby调用的bash以登录Shell模式运行,你只需要在命令里明确指定bash的登录参数即可,直接修改你的代码为:
output = `bash --login -c '/root/script'`
或者更简洁的写法(-l是--login的简写):
output = `bash -l -c '/root/script'`
为什么这么做?
默认情况下,Ruby的反引号(或者%x()语法)启动的是非登录、非交互式的Shell。这种Shell不会加载登录Shell特有的配置文件,比如~/.bash_profile、/etc/profile或者~/.bash_login。你的脚本之所以在非登录Shell下报错,大概率是依赖这些配置里的环境变量(比如PATH、自定义变量)、别名或者初始化脚本。
用--login(或-l)参数启动bash后,它会以登录Shell的身份运行,自动加载这些必要的配置,这样脚本就能获得正确的运行环境了。
额外注意事项
- 确保你的脚本
/root/script有可执行权限:可以用chmod +x /root/script设置。 - 如果你的Ruby进程不是以root用户运行的,要注意
/root目录的默认权限是700,普通用户无法访问,这时候可能会出现权限错误,需要调整目录权限或者脚本位置。
内容的提问来源于stack exchange,提问作者Adel Ahmed
相关产品推荐
相关产品推荐

