看板 Linux 關於我們 聯絡資訊
我通常是用"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
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:#1EUR5Ips 有版友提到IPC(行程間通訊)做法,我認為還有個問 09/21 22:37
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