Inicie a sessão tmux e garanta que todos os filhos terminem

Inicie a sessão tmux e garanta que todos os filhos terminem

Eu uso o tmux para desenvolvimento, tenho uma tarefa rodando em uma janela e outra sozinha. Eu defini a convenção de que o nome base do diretório do projeto é o nome da sessão tmux.

export SESSION_NAME="my-project-name"
tmux kill-session -t "$SESSION_NAME"
tmux new-session -s "$SESSION_NAME" \
                "api.start --monitored" \; \
                split-window "ui.start --monitored" \; \
                select-layout tiled \; \
                set-option -w remain-on-exit on \; \
                set-option -w mouse on \; \
                set-option -g mouse on \; \
                bind-key -n C-c kill-session -t "$SESSION_NAME"

Tudo parece funcionar corretamente, exceto se iniciar um projeto diferente com a mesma convenção, de alguma forma o CTRL+c na primeira sessão pensa que SESSION_NAME é a sessão mais recente gerada pelo tmux, o que não é o que eu esperava.

Responder1

No trecho que você postou, cada aparência $SESSION_NAMEé expandida pelo shell e cada uma tmuxobtém o valor expandido como um argumento de linha de comando.

(Mesmo que isso não aconteça e você queira expandir isso $SESSION_NAMEmais tarde dentro do tmux ou dentro de um shell dentro do tmux, você export SESSION_NAME="my-project-name"pode ser inútil por causa decomo tmuxconstrói o ambiente. A update-environmentopção ou new-session -e …comando pode ser útil.)

Isso inclui $SESSION_NAMEem bind-key -n C-c kill-session -t "$SESSION_NAME". Suas tmuxexecuções:

bind-key -n C-c kill-session -t my-project-name

Então, para um projeto diferente, o comando tmux é como:

bind-key -n C-c kill-session -t different-name

O importante é que bind-keyele não se destina a uma única sessão. bind-key -n C-c …altera o comportamento de Ctrl+ cpara todo o servidor tmux. No seu caso, o último bind-keysubstitui a tarefa anterior e, em seguida, Ctrl+ cem qualquer sessão irá kill-session -t different-name.

Acho que você poderia usar a key-tableopção de definir a tabela de chaves padrão para algo diferente root, separadamente para cada sessão. Em cada nova tabela de chaves você pode definir uma ligação diferente para C-c. Eu não testei isso, eupensarpode ser possível.

Se eu fosse você, faria uma coisa mais simples. Eu faria isso:

tmux bind-key -n C-c kill-session

kill-sessionsem -tmetas oatualsessão, então essa ligação deve fazer o que você deseja my-project-nameou different-namequalquer outra sessão.

Francamente, "qualquer outra sessão" é demais para mim. Eu não gostaria de Ctrl+ cmatar tudo na minhapropósito geralsessão(ões). Eu resolveria isso:

  • deixando C-csozinho e escolhendo outro pressionamento de tecla como "SIGINT global" e, em seguida, usando intencionalmente um ou outro;

  • ou "marcando" explicitamente as sessões que devem usar Ctrl+ ccomo "SIGINT global". Pode ser algo assim:

    tmux new-session -e 'TMUX_GLOBAL_SIGINT=1' \; \
          bind-key -n C-c if-shell '[ -n "$TMUX_GLOBAL_SIGINT" ]' kill-session 'send-keys C-c'
    

    Agora, em cada sessão que possui TMUX_GLOBAL_SIGINTvariável não vazia em seu ambiente, Ctrl+ cencerrará a sessão. Em todas as sessões onde TMUX_GLOBAL_SIGINTestiver vazio ou não definido Ctrl+ cfuncionará normalmente.

    Notas:

    • Para uma sessão já iniciada, você pode alterar a configuração com tmux set-environment -u TMUX_GLOBAL_SIGINTou tmux set-environment TMUX_GLOBAL_SIGINT 1(use -tpara direcionar uma sessão específica, não necessariamente a atual).

    • Um shell (ou outro programa) iniciado no tmux pode herdar TMUX_GLOBAL_SIGINT. Se for executado tmux new-session …(dependendo de update-environmenttal), a nova sessão também poderá herdar a variável, mesmo sem explícito -e 'TMUX_GLOBAL_SIGINT=1'. Leia man 1 tmuxe aprenda como o tmux gerencia o ambiente.

informação relacionada