tmux pencere adını prompt_command, ps1 veya uzak ssh ana bilgisayar adı olarak yeniden adlandırmak mı?


25

Tmux pencere başlığının otomatik olarak prompt_command, ps1 veya yalnızca bir makinenin ana bilgisayar adı olarak yeniden adlandırılmasını istiyorum ssh. "ssh" etiketli 9 pencerenin açılması gerçekten işe yaramaz. Sysadmin işini yaparken El ile yeniden adlandırmak için yeni ekranlar açtım ve etrafa çok ssh.

Fark ettiğim bir şey tmux, xtermpencere başlığını güncellemektir, bu yüzden bilmek zorunda olduğunu hissediyorum.

Herhangi bir yardım? screenBu özelliği elde edebilseydim bile geri dönmeye razı olurdum .

Yanıtlar:


15

PS1Direkt olarak sana bakmanın hiçbir yolunun farkında değilim .

Ancak, tmuxpencere adını ayarlamak için aynı komutları anlar screen.

Aşağıdaki konularda böyle bir işlevi tanımlayabilirsiniz Yani ~/.bashrcya ~/.zshrc:

settitle() {
    printf "\033k$1\033\\"
}

ve sonra settitleher yerden arayın .

Örneğin, PS1değişkeninize dahil edebilirsiniz , örneğin

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

veya yoluyla PROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

Şimdi anlıyorum ki tmuxmasaüstünüzde koşuyorsunuz ve bu sshkomutların ana bilgisayar adına sahip olmak yerine komutları kullanmak sshçok daha kolay.

settitleKendi bölgene eklediğin göz önüne alındığında ~/.bashrc, tek yapmak istediğin de bunu eklemek.

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

Bassh'ı zsh ile değiştirin veya gerekirse daha uygun bir şey kullanın.


Bu gerçekten, uzak kutudaki .bashrc kurulumuna sahip olmadan pencere başlığını uzaktaki kutunun ana bilgisayar adına adlandırmaz. Biraz kaygan öğrendim ama teşekkür ederim.
user68782

İstediğiniz tek şey yerel tarafınızdaki ana bilgisayar adıysa, bu çok daha kolaydır. Bir saniye
bekle

parlak! teşekkür ederim. Maalesef isteğimi açıklayamadığımda iki soru ile sonuçlandı. tekrar teşekkürler!
user68782

Tmux pencere başlığını bir hevesle değiştirdiği için, pencere başlığında tmux tarafından yapılan normal değişiklikler ile bunun çok hızlı bir şekilde üzerine yazılabilir.
UtahJarhead

Teşekkürler! Ben kullandım PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- çünkü @ Mikel'in koduyla -bash: : No such file or directoryher komut isteminden önce bir ana bilgisayar adı ve bir hata alamadım. O geliyor bana $()ne çalıştırmak için deneyin bash yapacak settitle döner . (Linux üzerinde bash kullanıyorum.)
tuomassalo

35

tmux rename-window -t${TMUX_PANE} "Title Text"

Bu, tmux başlıklarını bir pencerede ayarlamanın doğru yoludur. $ TMUX_PANE değişkeni tmux tarafından ayarlanır ve farklı bölmeleri ayırt etmek için kullanılır.


2
Aktif pencere olduğundan, bunun -t${TMUX_PANE}gerekli olduğunu sanmıyorum (en azından benim için değildi).
Christopher,

8
@Christopher sleep 3Pencereleri çalıştırıyor, söylüyor ve değiştirirseniz, istemi aksi takdirde uyku tamamlandığında komut yanlış pencereye gönderir. (Buraya gelmemin sebebi bu, +1).
quornian


8

Hem Mikel'in hem de UtahJarhead'in cevaplarını birleştirerek .zshrcbu sorunu çözmek için aşağıdakileri kullandım :

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

Varsayılan olarak otomatik pencere yeniden adlandırma etkin ve uzak ana bilgisayardan çıktıktan sonra yeniden etkinleştirmenin bir yolunu bulamıyorum. Böylece, pencereden tamamen çıktım - iş akışım için bir sorun değil. Eğer 'bash' olarak adlandırmayı tercih ederseniz, exitsatırı ile değiştirebilirsiniz tmux rename-window "bash".


1
Tmux rename-window hostname -skomutunu ssh "@ $" komutundan sonra kullanıyorum , temel olarak başlığı "ağ geçidi" makineme "sıfırlar".
andrei

7

Yerine exitveya tmux rename-window "bash"kullanabilirsiniz

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

Bu, bir sonraki komutlar için otomatik olarak pencereyi yeniden adlandıran normal işlevi yeniden etkinleştirir.

ifAdlandırma (olmadan) blok önler tmuxgelen geçerli pencereyi ssh(üzerinden diğer kabukları kullanılan komutları tmux).


Bunların if env | grep -q "TMUX_PANE"; thenyerine bir yerlere gittim ps -p...ama aynı prensibi.
atomlar

1

Bunun çok uzun zaman önce cevaplandığını biliyorum, ancak neye kattığımı ve bulduğumu ekledim (kabul edilen cevaba göre) .. Bunu tüm sunucularımın / etc / bashrc dizinine ekledim (kolay) kumaş, kukla, vb)

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

Ve pencere adını otomatik olarak ekranda veya tmux'ta ayarlar.


iç dns kullanıyoruz, bu yüzden hostname -sfazladan etki alanı öğelerini kaldırıyor, böylece server1.internal.local, sunucuda sadece 1'i gösteriyor
Brian

1

Başka bir çözüm, ssh oturumundan sonra etkin pencereyi önceki adıyla yeniden adlandırmak olacaktır:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}

0

Bu, tmux 2.1yerel ve sunucularda zsh ile birlikte ve bunlarla çalışır:

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

Windows adını değiştirmeden önce izin ver-yeniden adlandır seçeneğini el ile devre dışı bırakmak zorunda kaldım - aksi halde sunucularımın çoğunda geçerli yolla değiştirildi (orada zsh kullanarak da). İşin iyi yanı: yeniden adlandırmayı yeniden etkinleştir seçeneğini yeniden etkinleştirirseniz, hemen çalışır.


0

Bunu ekle .profileveya.bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}

0

Tüm bu örneklerde şunu not ediyorum:

command ssh "$@"

Çıkış kodunu alıp, onunla işlevden çıkmak isteyebilirsiniz, aksi halde şöyle olabilir:

ssh server false

0 döndürür.

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

Ssh'ın dönüş kodu ile ssh çıkacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.