我在使用screen
的Linux机器上,我正在尝试编写一个(相当可移植的)函数,该函数在一个新的,分离的屏幕会话中运行bash函数,该会话在完成时自动关闭。我已经取得了一些成功,但我注意到以下行为:
如果我在mail_submit()
文件中包含~/.bashrc
的定义,我可以运行
mail_submit foo
在终端中,我也可以在新的屏幕会话中访问别名:
screen -S test
mail_submit foo
但是,以下命令不起作用:
screen -d -m -S test sh -c 'mail_submit foo'
大概是因为sh -c
启动了一个不知道我的~/.bashrc
个人资料的新shell。所以,我可以使用以下修复:
screen -d -m -S test sh -c 'source ~/.bashrc; mail_submit foo'
的工作。
但是如果我想将这个功能包装成一个bash别名(这是我的最终目标),这将导致一种奇怪的自我引用情况。
问题:有什么方法可以让sh -c知道我的~/.bashrc
个人资料的位置,或者使用获取文件并创建别名的变体?
编辑:我可以将shell脚本保存在我的主目录中,并创建一个运行的别名
screen -d -m -S test bash -c '~/mail_submit.sh $1'
但我仍然很想知道其他可能的修复方法。
答案 0 :(得分:2)
你的意思是screen -d -m -S test bash -c 'mail_submit foo'
?
看起来您正在尝试使用shell(sh)运行命令,而不是bourne again shell(bash),它实际上是shell解释器,它实际上读取~/.bashrc
配置文件。
编辑:默认情况下不会提供.bashrc文件,因为屏幕不会将bash进程创建为登录shell,即读取.bashrc文件时。使用行defshell -bash
创建.screenrc文件将创建bash进程作为登录shell,然后调用.bashrc文件。
答案 1 :(得分:2)
默认~/.bashrc
在其上面(或上部的其他位置)包含此([[ "$-" != *i* ]] && return
)一小段代码。如果bash shell不以交互模式运行,则此行将阻止~/.bashrc
来源。
你可以: