2016-03-01 35 views
0

我使用screen在Linux机器上,而我试图写它在完成后自动关闭一个新的,独立的屏幕会话中运行一个bash功能的(相当便携)功能。我已经取得了一些成功,但我注意到以下行为:发送猛砸别名来分离屏幕会话

如果我包括我的~/.bashrc文件中的mail_submit()定义,我可以运行

mail_submit foo 
在终端

,而且我可以访问别名在一个新的屏幕会话:

screen -S test 
    mail_submit foo 

然而,下面的命令不起作用

screen -d -m -S test sh -c 'mail_submit foo' 

可能是因为sh -c启动了一个不知道我的~/.bashrc配置文件的新壳。所以,我可以使用下面的解决办法:

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' 

的别名,但我还是会好奇地听到其他可能的修复。

回答

2

默认~/.bashrc包含此([[ "$-" != *i* ]] && return)顶部(或上部其他地方)的一小段代码。如果bash shell没有以交互模式运行,此行将阻止~/.bashrc来自beeing sourced。

,你可以:

  1. 删除此行
  2. 创建一个新的文件,该文件将只包含你需要的别名,来源,
  3. 创建一个小的bash脚本,而不是一个别名和运行
2

你的意思screen -d -m -S test bash -c 'mail_submit foo'? 它看起来像你想运行与外壳(SH)的命令,而不是称作Bourne Again shell(bash)的,这是命令解释程序实际上读取~/.bashrc轮廓。

编辑:.bashrc文件没有被默认的来源,因为屏幕不会创建bash进程作为登录shell,当读.bashrc文件是。创建.screenrc文件与线defshell -bash将创建bash进程作为登录shell来代替,然后将调用.bashrc文件。

+0

好抓;不幸的是这个问题依然存在,并且当我明确地给出'〜/ .bashrc'时也是如此。 – chriswhite

+0

尝试使用'defshell -bash'设置〜/ .screenrc文件,这使得bash作为登录shell运行,它将调用〜./。bashrc文件,因为默认情况下,屏幕不会运行bash作为登录shell(读取.bashrc文件时)。有关更多信息,请参阅此帖子:https://bbs.archlinux.org/viewtopic.php?id = 82519 – Incognito