实现以下功能的干净方法是什么:
function screen_create_or_reuse(){
if [ running_screen_session "$1" ]; then
reattach_screen_session screen_name_"$1"
else
create_screen_session "$1" screen_config_"$1" screen_name_"$1"
fi
}
目前,我必须担心会话是否已经在运行(screen -ls
或screen -wipe
)。根据它,如果它没有运行:手动创建具有自定义配置和名称的会话 ( screen -c config -S name
),然后手动重新附加。我想要一个可以screen_create_or_reuse name
处理所有这些细节的命令。
我想过创建 bash 脚本来检测会话等的存在,但我看到屏幕已经有很多选项,也许我会做得太过分。
使用屏幕实现上述目标的干净方法是什么?
答案1
以下选项来自man screen
:
-d -R Reattach a session and if necessary detach or even create it first.
使用它来-S
设置会话名称。
答案2
在大多数情况下,-S foo -d -RR
它将执行您想要的操作:它附加到您指定名称的会话,并创建一个会话(如果尚不存在)。
我喜欢更进一步,寻找特定于名称的配置文件。这让我可以为不同的会话名称定义不同的环境变量、启动应用程序等。
这是我的文件etc/screen/0.screenrc
,它来自其他特定于会话的配置文件:
source ~/.screenrc
unsetenv DISPLAY
msgminwait 0
msgwait 0
screen -t post_initialization 39 sh -c 'sleep 1; screen -X msgwait 5; screen -X msgminwait 1'
这是一个每会话配置文件示例etc/term/emacs.screenrc
,它启动一个运行 Emacs 的窗口(对于可以连接到多个终端的 Emacs 23 不再有用)。
sessionname emacs
source 0.screenrc
screen -t emacs emacs -nw
这是我用来调用这些会话的脚本的改编版本。使用 eg 调用它scr emacs
以拾取上面显示的会话。如果 中没有与会话名称相对应的配置文件~/etc/screen
,我将运行 shell。
#!/bin/sh
session_name=$1; shift
if [ -r "$HOME/etc/screen/$session_name.screenrc" ]; then
exec screen -S "$session_name" -d -RR -c "$HOME/etc/screen/$session_name.screenrc" "$@"
else
if [ $# -eq 0 ]; then set "$SHELL"; fi
exec screen -S "$session_name" -d -RR -c "$HOME/etc/screen/0.screenrc" "$@"
fi