Impedisci la chiusura di riquadro / finestra al termine del comando - tmux


33

Nel mio tmux.conffile l'ho configurato per aprire Windows, nominarli, impostare i pannelli ecc. Ecc.

Comunque un problema che ho è che se uno dei pannelli lancia un comando, diciamo ls, allora il riquadro si chiude automaticamente dopo il comando (istantaneamente). C'è un modo per prevenire questo comportamento? O è caduto in una shell normale dopo il completamento di un comando?

Sto assumendo che devo avviare una shell -> esegui il comando all'avvio del riquadro, ma sarò dannato se riesco a capire come. Ho cercato su Google un po 'per questo problema, ma sono arrivato breve.

Risposte:


22

Hai un paio di opzioni.

  1. Invece di correre lsnella tua finestra, esegui una shell, quindi invia i tasti della shell per eseguire:

    tmux start-server  
    tmux new-session -d -s session  
    tmux new-window -t session:1  
    tmux send-keys -t session:1 ls C-m
    
  2. Puoi pranzare una sequenza di comandi in modo da lasciarti con una shell bash dopo aver eseguito gli altri comandi:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. Vedere la risposta di jasonwryan per i dettagli remain-on-exitsull'opzione per mantenere in vita i riquadri dopo la chiusura del processo in modo da poter rivedere l'output.

  4. Se vale la pena vedere l'output di alcuni comandi una volta, potrebbe valere la pena aggiornarlo. Se stai monitorando l'output di qualcosa, puoi watchottenere periodicamente un nuovo output. Questo dovrebbe funzionare bene con i riquadri in tmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    

Grazie uomo! Risposta eccezionale, numero 2 e numero 4 sono esattamente ciò per cui stavo lavorando, ma anche il numero 1 sembra un'ottima alternativa. Grazie per tutto l'aiuto, è molto apprezzato (entrambi).
Spezzatino il

1
Il vantaggio di # 1 è che il comando rimane nella cronologia della shell e può essere facilmente rieseguito. Se il comando era grande e brutto, allora questo è molto utile.
goertzenator,

1
Funziona per me senza il start-servercomando, penso che venga avviato automaticamente se necessario. Esiste comunque un vantaggio nel chiamarlo esplicitamente?
Luator,

1
@luator Penso che l'avvio automatico di un server se non ne è stato trovato nessuno potrebbe essere stato aggiunto da tmuxquando ho scritto questa risposta. Non conosco alcun vantaggio se la tua versione genera un processo server, se necessario.
Caleb,

13

È possibile utilizzare l' remain-on-exitopzione:

resta-all'uscita [on | off]
Una finestra con questo flag impostato non viene distrutta all'uscita dal programma in esecuzione. La finestra può essere riattivata con il comando respawn-window.

Per semplificare il processo di rigenerazione, potresti voler associarlo a una chiave:

bind-key R respawn-window

Questo ti assicurerà di non rimanere con finestre morte quando i programmi escono.


Ci stavo arrivando! Ho finito il tempo e ho deciso che avrei dovuto modificare la mia risposta. Sì, questa è la terza opzione, il principale svantaggio è che lascia una finestra di sola lettura che non è possibile riutilizzare senza ricreare.
Caleb,

Buon punto. Ho aggiornato con una (semi) soluzione alternativa.
Jasonwryan,

Funziona con i riquadri?
Azmeuk,

1
impostarlo dalla riga di comando può essere fatto contmux set-option remain-on-exit on
rmanna

1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace

1

Ecco un esempio esteso usando il send-keysmetodo raccomandato da @Caleb

#!/bin/sh
tmux start-server
tmux new-session -d -n 'mywindowname'
tmux send-keys -t mywindowname 'cd notes' Enter 'vim whiteboard/tasks.md' Enter
tmux new-window -d -n 'secondwindowname' # this -d prevents focus from changing to the new window
tmux -2 attach-session -d
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.