[这可以算是我上一个问题的第二步创建后可以更改 GNU screen 会话名称吗?]
实际上,我想编写一个可以显示当前屏幕会话名称并更改当前会话名称的脚本。
例如:
sren armcross
它会将会话名称更改为armcross
(ARM gcc 交叉编译器)并输出类似以下内容:
screen session name changed from '25278.pts-15.linux-ic37' to 'armcross'
所以,现在的关键问题是如何获取当前会话名称。不仅要显示旧会话名称,还要根据创建后可以更改 GNU screen 会话名称吗?,我必须先知道它(传递给 -d -r)然后才能将其更改为其他东西。
我们可以将其用作$STY
当前会话名称吗?不可以。$STY
将会话名称更改为用户定义的名称后,名称不会改变。但是,对于命令
screen -d -r <oldsessname> -X sessionname armcross
<oldsessname> 应该是用户定义的名称(如果曾经定义)而不是$STY
,否则,屏幕会弹出错误“未找到屏幕会话”。
也许,有一种更详细的方法,用于screen -list
列出所有会话(列出用户定义的名称),然后将 $STY 中的 pid 部分与列出的会话进行匹配,我们将找到当前会话的用户定义名称。对于如此简单的问题,它不应该这么冗长。你不这么认为吗?
-d -D 和 -r -R 选项似乎向屏幕用户暴露了太多实现细节。似乎要重命名会话,您必须先将其分离,然后重命名,然后重新附加。对吗?
我的环境:opensuse 11.3,GNU screen 4.00.03 (FAU) 23-Oct-06
谢谢。
答案1
你能试试这个吗?
screen -d -r $(ps -o ppid -p $$ --no-headers) -X sessionname newsessionname
答案2
看来,当您设置sessionname
手动屏幕时,相关文件的名称会发生变化,但不会更新理想的/var/run/screen/S-$USER/
值。$STY
尽管包含与此会话名称相关的的原始值,但我们仍然可以使用$STY
来获取当前会话的名称。$STY
PID
PID=$(echo $STY | awk -F"." '{ print $1}')
然后您可以使用PID
从 /var/run/screen/S-$USER 获取会话名称
SESSIONNAME=$( ls /var/run/screen/S-$USER/$PID* | awk -F"." '{print $2}' )
现在您有了会话名称,SESSIONNAME
您可以使用它来做您想做的事情。