将Bash别名发送到分离的屏幕会话

时间:2016-03-01 14:37:10

标签: bash shell alias gnu-screen

我在使用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'

但我仍然很想知道其他可能的修复方法。

2 个答案:

答案 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来源。

你可以:

  1. 删除此行
  2. 创建一个新文件,该文件仅包含您需要的别名
  3. 创建一个小bash脚本而不是别名并运行