→ chiouss:$WINDOW 09/21 00:22
這變數會印出screen window的index
似乎無法用來判斷是否在tty中使用screen
(因為在x-term中使用screen印$WINDOW, 其值跟在tty中用screen印出來一樣)
推 bitlife:alias tmux='export TMUXTTY=`tty`; tmux' 09/21 09:01
→ bitlife:不知道上述作法是否符合需求. 09/21 09:02
No, 因為在tty建立的screen/tmux session後detach之,
然後從x-term attach該session, TMUXTTY的值還是/dev/tty/i
→ bitlife:你現在是需要在被控制程式中能取得目前控制之screen/tmux 09/21 16:22
→ bitlife:嗎?被控制程式一定是shell或可能是任何程式? 09/21 16:23
→ bitlife:我的shell指的是交談式的shell. 09/21 16:25
我看了好幾次你的推文 但還是看不太懂 十分抱歉= =
我把我的情境講出來好了 看有沒有回答到你的推文
(有點長 很多部分跟本文問的問題也許沒甚麼關係)
我平常習慣把鍵盤左邊的Ctrl跟Caps Lock對調
不是真的硬體上對調 而是使用軟體的方式對調
在X11(graphical mode)跟在tty(console mode)下 Ctrl跟Caps Lock對調的方式不相同
X11下要對調Ctrl跟Caps Lock可以這樣做
法一:
step 1.先準備兩個script: caps_lock_as_ctrl.sh 跟 .xmodmap
caps_lock_as_ctrl.sh的內容:
xmodmap ~/.xmodmap 2>/dev/null
.xmodmap的內容:
!
!! Caps Lock as Ctrl
!!
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L
step 2. 在啟動X時執行step 1.的caps_lock_as_ctrl.sh
以Xubuntu來說是這樣:
設定值 > 設定值管理員 > 工作階段與起始 >
應用程式自動啟動 > 加入 > 名稱(隨便);
> 指令 = bash -c "/home/user/path_to/caps_lock_as_ctrl.sh"
或新增檔案: "~/.config/autostart/caps_lock_as_ctrl.desktop", 內容如下:
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=caps_lock_as_ctrl
Comment=
Exec=bash -c "/home/user/path_to/caps_lock_as_ctrl.sh"
StartupNotify=false
Terminal=false
Hidden=false
法二:
設定值 > 設定值管理員 > 工作階段與起始 > 應用程式自動啟動 > 加入
> 名稱(隨便); 指令 = setxkbmap -option "ctrl:nocaps"
可以發現對X11來說 不管是法一或法二 執行時都不需要root權限
然而在tty下就不是這樣了 tty下對調Ctrl跟Caps Lock的做法:
在 ~/.bashrc 中加入這個function跟alias
swap_ctrl_and_capslock() {
if [ 在 tty 中 ]
then
bash -c 'echo -e "$(dumpkeys | grep ^keymaps)\nkeycode 58 = Control\nkeycode 29 = Caps_Lock" | sudo loadkeys'
else # 在 X11 中
touch ~/.bashrc # no operation
fi
}; alias ccc='swap_ctrl_and_capslock'
loadkeys指令需要sudo權限才能執行 我又覺得打密碼很麻煩
於是寫成一個function 想交換ctrl跟caps lock時才執行(我並非每次進tty都會交換ctrl跟caps lock)
問題出在黃色if的部分 我本來是寫:
if tty | grep tty > /dev/null
但在tty中建立或attach screen/tmux其值為假 就不會交換ctrl跟caps lock了= =
所以才問了本文的問題
想知道有甚麼方法能準確區分到底是在tty中/在tty中用screen(tmux)/在X11/在X11用screen(tmux)
至於b大你問的...我看不懂所謂的"被控制程式"是甚麼(除了shell還有可能是甚麼呀?)
不過就我的情況來說一定是在interactive shell執行此function啦...
不知道有沒有回答到你的問題...
※ 編輯: Holocaust123 來自: 140.112.31.155 (09/21 20:06)
推 bitlife:我大概懂了. 我的想法如下:有沒有X11,可以判斷 $DISPLAY 09/21 22:33
→ bitlife:你主要的問題應該是本來是在非 tty 下,後來又被tty的tmux 09/21 22:34
→ bitlife:attach(或相反情況,這裏我假設若前後條件一樣是沒問題) 09/21 22:35
→ bitlife:這裏產生的問題是新的tmux環境變數無法被舊的shell繼承 09/21 22:36
→ bitlife:題,就是shell不知道哪個新的tmux才是新主人. 這點我倒是有 09/21 22:37
→ bitlife:個第一時間想法,還沒去試,方法如下:把版友的方法的檔名 09/21 22:38
→ bitlife:的差異部分,改用 tmux 的 pid,然後 shell 去 /proc 目錄 09/21 22:38
→ bitlife:搜尋某個 pid 的 fd 目錄下,有開啟相同的 pts 的就是自己 09/21 22:39
→ bitlife:的新主人. 表達得有點亂,以上希望你能看懂,也希望能有幫助 09/21 22:39
推 kdjf:突然想到: 反過來看$DISPLAY 是不是在xserver下? 09/21 23:00
推 ckc1ark:我不知道screen/tmux的差別 不過用$STY來判斷應該不會重覆 09/22 00:26
→ ckc1ark:裡面也是有pid的資訊 09/22 00:26