将 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
被获取。
你可以:
- 删除此行
- 创建一个新文件,其中只包含您需要的别名和来源
- 创建一个小 bash 脚本而不是别名 运行
我在 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
被获取。
你可以:
- 删除此行
- 创建一个新文件,其中只包含您需要的别名和来源
- 创建一个小 bash 脚本而不是别名 运行