[問題] 如何判斷是否正在tty下使用screen/tmux

看板Linux作者 (一步一腳印)時間12年前 (2011/09/21 00:17), 編輯推噓4(4015)
留言19則, 4人參與, 最新討論串1/2 (看更多)
我通常是用"tty"這個指令判斷是否正在tty下 例如 1. 在tty(1~6)時(假設在tty1) user@local_host:~$ tty /dev/tty/1 => tty 2. 在x11中使用gnome-termial時 user@local_host:~$ tty /dev/pts/7 => pts 3. 用putty遠端到遠端Linux伺服器時 user@remote_host:~$ tty /dev/pts/10 => pts 4. 在gnome-terminal中使用screen/tmux時 user@local_host:~$ tty /dev/pts/8 => pts 不過 5. 在tty(1~6)中使用screen/tmux時 user@local_host:~$ tty /dev/pts/8 => 恩...好希望它顯示的是tty = = 我希望在情況5.中, 能判斷出"我正在tty使用screen/tmux" 然而此時"tty"這個指令似乎就沒用了 請問有甚麼其他判斷方法嗎 (除了印出$TERM之外 因為不論是在x或tty中attach screen, $TERM的內容都是一樣的 還有我不希望手動調整$TERM的內容) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.31.149

09/21 00:22, , 1F
$WINDOW
09/21 00:22, 1F
這變數會印出screen window的index 似乎無法用來判斷是否在tty中使用screen (因為在x-term中使用screen印$WINDOW, 其值跟在tty中用screen印出來一樣)

09/21 09:01, , 2F
alias tmux='export TMUXTTY=`tty`; tmux'
09/21 09:01, 2F

09/21 09:02, , 3F
不知道上述作法是否符合需求.
09/21 09:02, 3F
No, 因為在tty建立的screen/tmux session後detach之, 然後從x-term attach該session, TMUXTTY的值還是/dev/tty/i

09/21 16:22, , 4F
你現在是需要在被控制程式中能取得目前控制之screen/tmux
09/21 16:22, 4F

09/21 16:23, , 5F
嗎?被控制程式一定是shell或可能是任何程式?
09/21 16:23, 5F

09/21 16:25, , 6F
我的shell指的是交談式的shell.
09/21 16:25, 6F
我看了好幾次你的推文 但還是看不太懂 十分抱歉= = 我把我的情境講出來好了 看有沒有回答到你的推文 (有點長 很多部分跟本文問的問題也許沒甚麼關係) 我平常習慣把鍵盤左邊的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)

09/21 22:33, , 7F
我大概懂了. 我的想法如下:有沒有X11,可以判斷 $DISPLAY
09/21 22:33, 7F

09/21 22:34, , 8F
你主要的問題應該是本來是在非 tty 下,後來又被tty的tmux
09/21 22:34, 8F

09/21 22:35, , 9F
attach(或相反情況,這裏我假設若前後條件一樣是沒問題)
09/21 22:35, 9F

09/21 22:36, , 10F
這裏產生的問題是新的tmux環境變數無法被舊的shell繼承
09/21 22:36, 10F

09/21 22:37, , 11F
#1EUR5Ips 有版友提到IPC(行程間通訊)做法,我認為還有個問
09/21 22:37, 11F

09/21 22:37, , 12F
題,就是shell不知道哪個新的tmux才是新主人. 這點我倒是有
09/21 22:37, 12F

09/21 22:38, , 13F
個第一時間想法,還沒去試,方法如下:把版友的方法的檔名
09/21 22:38, 13F

09/21 22:38, , 14F
的差異部分,改用 tmux 的 pid,然後 shell 去 /proc 目錄
09/21 22:38, 14F

09/21 22:39, , 15F
搜尋某個 pid 的 fd 目錄下,有開啟相同的 pts 的就是自己
09/21 22:39, 15F

09/21 22:39, , 16F
的新主人. 表達得有點亂,以上希望你能看懂,也希望能有幫助
09/21 22:39, 16F

09/21 23:00, , 17F
突然想到: 反過來看$DISPLAY 是不是在xserver下?
09/21 23:00, 17F

09/22 00:26, , 18F
我不知道screen/tmux的差別 不過用$STY來判斷應該不會重覆
09/22 00:26, 18F

09/22 00:26, , 19F
裡面也是有pid的資訊
09/22 00:26, 19F
文章代碼(AID): #1EUBoPw4 (Linux)
文章代碼(AID): #1EUBoPw4 (Linux)