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

Sending Bash Aliases to detached screen sessions

我在 Linux 机器上使用 screen,我正在尝试编写一个(相当可移植的)函数,其中 运行 是一个 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 开始了一个新的 shell,它不知道我的 ~/.bashrc 个人资料。因此,我可以使用以下修复方法:

    screen -d -m -S test sh -c 'source ~/.bashrc; mail_submit foo'

哪个有效。

但是如果我想将这个功能包装到一个 bash 别名中(这是我的最终目标),这将导致一种奇怪的自我引用情况。

问题:有什么简单的方法可以让 sh -c 知道我的 ~/.bashrc 配置文件的位置,或者使用获取文件和创建文件的变体别名?

编辑: 我可以将 shell 脚本保存在我的主目录中,并创建一个 运行s

的别名
    screen -d -m -S test bash -c '~/mail_submit.sh '

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

你是说 screen -d -m -S test bash -c 'mail_submit foo' 吗? 看起来您正在尝试使用 shell (sh) 运行 命令,而不是 shell (bash),这是 shell 实际读取 ~/.bashrc 配置文件的解释器。

编辑:默认情况下不获取 .bashrc 文件,因为 screen 不会创建 bash 进程作为登录 shell,这是 .bashrc 文件被读取。使用 defshell -bash 行创建 .screenrc 文件将创建 bash 进程作为登录 shell,然后它将调用 .bashrc 文件。

默认值 ~/.bashrc 包含此 ([[ "$-" != *i* ]] && return) 一小段代码(或上部其他地方)。如果 bash shell 在交互模式下不 运行,则此行将阻止 ~/.bashrc 被获取。

你可以:

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