Tmux vs. Screen: Qual o melhor multiplexador de terminal Linux?

O utilitário Linux tmux, tal como o `screen`, funciona como um multiplicador de terminal. A sua popularidade é inegável, o que nos leva a confrontar ambos os programas. Será que o tmux é superior ou é apenas uma questão de familiaridade?

Comparativo: tmux vs. screen

Tanto o tmux quanto o GNU screen são multiplexadores de terminal. Estes permitem a execução de múltiplas janelas dentro de uma única janela de terminal, comutando entre elas. Cada janela pode ser dividida em painéis, oferecendo linhas de comando independentes.

Além disso, é possível desanexar uma sessão, que passa a correr em segundo plano, mesmo após fechar a janela do terminal que a iniciou. Pode-se posteriormente abrir uma nova janela de terminal e reconectar a sessão ativa. Este processo é também viável através de conexões SSH.

Imagine desconectar uma sessão no seu computador, ir para casa e aceder ao mesmo remotamente. Ao reconectar, pode reativar a sessão em segundo plano e utilizá-la interativamente.

O que é o comando screen?

O comando `screen` é também um multiplexador de terminal, com diversas funcionalidades. Para explorar todas as suas capacidades, consulte um artigo dedicado.

Neste contexto, vamos focar no tmux. Ao longo da análise, indicaremos como o `screen` aborda as mesmas funcionalidades.

Um aspeto do `screen` era particularmente frustrante, o qual iremos abordar e verificar se o tmux oferece uma melhor solução.

Instalação do tmux

Enquanto o `screen` é usualmente instalado por defeito em distribuições Linux populares, o mesmo não acontece com o tmux. Para instalar o tmux no Ubuntu, execute o seguinte comando:

sudo apt-get install tmux

No Manjaro, utilize o `pacman`:

sudo pacman -Sy tmux

No Fedora 31, o tmux já está preinstalado.

Iniciar uma Sessão tmux

Para iniciar o tmux, basta digitar o comando e pressionar Enter:

tmux

Ao iniciar uma sessão tmux, uma barra de estado será exibida na janela do terminal.

A barra de estado exibe o nome do host, hora e data do lado direito. Do lado esquerdo, apresenta as seguintes informações relativas à sessão:

[0]: O nome da sessão. Por predefinição, são numeradas, começando por zero. Iremos ver como atribuir nomes significativos às sessões mais adiante.
0: bash *: O número 0 indica que esta é a primeira janela desta sessão. O único processo em execução nesta sessão é o `bash`. Se executar um programa, o seu nome aparecerá aqui. O asterisco * indica a janela que está atualmente ativa. Cada vez que cria uma nova janela numa sessão tmux, o número da janela e o nome do programa em execução são adicionados à barra de estado.

O comando `screen` não oferece uma barra de estado, o que exige alguma prática para compreender o que se passa.

Por outro lado, não se perde uma linha da janela do terminal. Geralmente, expande-se a janela do terminal para aproveitar ao máximo um multiplexador. Nesse caso, perder uma linha para a barra de estado não é um grande problema. Optamos por manter as imagens das janelas do terminal com o tamanho padrão para fins ilustrativos.

Os comandos são enviados ao tmux através de combinações de teclas. Primeiramente, pressione Ctrl + B para chamar a atenção do tmux. Em seguida, pressione rapidamente a próxima tecla para enviar o comando. Os comandos são dados pressionando letras, números, sinais de pontuação ou teclas de seta.

O `screen` utiliza o mesmo princípio, mas usa Ctrl + A para chamar a atenção.

Para fechar uma janela, pressione Ctrl + B e, em seguida, X. A barra de estado ficará amarela e será solicitado a confirmação para encerrar a janela.

Pressione Y para fechar a janela ou N se mudar de ideias. Não é necessário pressionar Enter; S ou N é suficiente para confirmar a sua escolha.

Ao pressionar Y, a janela fecha. Se esta for a única janela na sessão, a sessão é encerrada. A sessão tmux é finalizada e regressa à linha de comando a partir da qual iniciou o tmux. Irá ver “[exited]” na janela do terminal.

Isto pode parecer óbvio, mas é uma confirmação de que a sessão foi encerrada e não apenas deixada a correr em segundo plano. Iremos discutir o desanexamento de sessões mais adiante.

Iniciar uma Sessão Tmux Nomeada

Caso inicie várias sessões tmux regularmente, irá apreciar a capacidade de atribuir nomes significativos a cada uma delas. Embora o `screen` também permita nomear as sessões, esses nomes não são exibidos nas janelas.

tmux new -s geek-1

Para iniciar o tmux com um nome de sessão, utilize o comando `new` (nova sessão) e a opção -s (nome da sessão). A nossa sessão será nomeada “geek-1”, pelo que escrevemos:

Sessão tmux com nome

Adicionar mais janelas Para criar uma nova janela na sessão atual, pressione Ctrl + B e, de seguida, C. Uma janela de terminal em branco será criada na sessão. Para mostrar algo a correr nesta nova janela, vamos iniciar o comando `dmesg`

dmesg -w

com a opção -w (seguir):

Agora, temos duas janelas na sessão: uma a executar o `top` e outra o `dmesg`. No entanto, apenas uma é visível de cada vez (mais sobre isso em breve).

Observe a parte esquerda da barra de estado. Ainda estamos na sessão tmux “geek-1”. Na janela zero, o `top` está em execução e, na janela um, o `dmesg`. O asterisco * indica a janela visível.
Para alternar entre as janelas, pressione Ctrl + B e, em seguida, uma das seguintes teclas:
N: exibe a próxima janela.

P: Exibe a janela anterior.

0 a 9: exibe uma janela numerada de 0 a 9.

Também pode selecionar uma janela a partir de uma lista. Ao pressionar Ctrl + B e, em seguida, W, será apresentada uma lista de janelas.

Para mover a barra de destaque amarela, utilize as setas para cima ou para baixo, as teclas Home ou End. A parte inferior do ecrã mostra uma pré-visualização do conteúdo da janela em destaque.

Pressione Enter para selecionar a janela em destaque ou Esc para sair da lista sem trocar a janela.

Desanexar e Anexar Sessões

Ao pressionar Ctrl + B e, em seguida, D, a sessão será desanexada. Continuará a ser executada em segundo plano, mas não será possível ver ou interagir com ela.

Iniciamos uma sessão com um processo em execução como exemplo. Em seguida, pressionamos Ctrl + B e D. A sessão desaparece e passa a ser executada em segundo plano.

Retornamos à janela original do terminal. O tmux informa que a sessão foi desanexada, relembrando o nome atribuído à sessão, o qual é utilizado para reconectar à sessão em segundo plano.

tmux attach-session -t geek-1

Para anexar uma sessão desanexada, usaremos o comando `attach-session` com a opção -t (sessão alvo). Também fornecemos o nome da sessão que desejamos relembrar.

Escrevemos:

A nossa sessão é restaurada, tornando-se visível e interativa.

Quaisquer processos de longa execução ou contínuos iniciados antes de desanexar a sessão continuarão a ser executados em segundo plano (a menos que tenham terminado) quando anexar a sessão.

O `screen` consegue fazer o mesmo, mas não de forma tão intuitiva.

tmux new -s geek-2

Gerir Múltiplas Sessões

dmesg -w

Vamos abrir outra janela de terminal e iniciar uma nova sessão tmux com o nome “geek-2”:

Nesta sessão, vamos iniciar o `dmesg`:

Agora, temos a nossa sessão tmux original “geek-1” e uma nova chamada “geek-2”.

A barra de estado indica que esta sessão se chama “geek-2”, e possui uma janela a executar o `dmesg`.

Ao pressionar Ctrl + B e, em seguida, D, esta sessão é desanexada.

De volta à sessão tmux “geek-1”, pressionamos Ctrl + B e, de seguida, S para visualizar uma lista de sessões tmux.

Esta é uma lista de sessões. A exibição anterior era uma lista de janelas dentro de uma única sessão.

Para mover a barra de destaque amarela, utilize as setas para cima ou para baixo, as teclas Home ou End. A secção inferior exibe uma pré-visualização do conteúdo da sessão em destaque.

Ao pressionar a seta para a direita, as janelas da sessão selecionada são exibidas.

Pressione Enter para selecionar a sessão ou janela em destaque, ou Esc para sair da lista de sessões sem alterar as sessões. Ao selecionar uma nova sessão, a sessão atual desconecta-se e a sessão selecionada é anexada.

Desanexamos a sessão “geek-2” antes de fazer isso. No entanto, pode fazê-lo com sessões que ainda estão anexadas às suas janelas de terminal originais. Ao fazê-lo, qualquer mudança no ecrã surgirá simultaneamente em ambas as sessões do tmux.

O comando `screen` também consegue executar esta função com um conjunto similar de comandos.

Trabalhar com Painéis de Janela

Ao pressionar Ctrl + B e, de seguida, aspas duplas (“), a janela é dividida horizontalmente em dois painéis.

Isto afeta apenas a janela atual; as outras sessões não são alteradas. Utilizamos o comando `tmux ls` no painel superior para listar as janelas nesta sessão. Existem duas, e a linha de estado indica que estamos na janela um. Ao saltar para a janela zero, pressionando Ctrl + B e depois 0 (zero), veremos que está exatamente como a deixamos.

Estes são duas linhas de comando independentes e não apenas duas visualizações numa janela; são `shells` distintos e separados. Para demonstrar isso, vamos executar um comando diferente em cada painel.

Vamos escrever o seguinte:

uname -a

ls -hl

Para mover entre painéis, pressione Ctrl + B e as setas para cima, para baixo, para a esquerda ou para a direita.

Ao pressionar Ctrl + B e o sinal de percentagem (%), o painel atual será dividido verticalmente.

Pressione Ctrl + B e, em seguida, Q para o tmux exibir brevemente o número de cada painel.

Esses números são usados em `prompts` e mensagens do tmux. Pressione Ctrl + B e, de seguida, X para fechar o painel atual. A barra de estado mudará para amarelo e será solicitado a confirmar o encerramento do painel. Pressione Y para remover o painel ou N para manter o estado atual.

Se pressionar Y, o painel será removido.

O comando `screen` também oferece painéis, mas são menos intuitivos. Um dos aspetos mais frustrantes do `screen` é o facto de os painéis desaparecerem ao reconectar a sessão quando esta foi desanexada. Esta limitação torna-se rapidamente um problema.

Guia de referência de Ctrl + B

Segue-se um guia de referência com os diferentes comandos que pode utilizar no tmux.
Comandos de Sessão
S: Listar sessões.
$: Renomear a sessão atual.

D: Desanexar a sessão atual.

Ctrl + B, e depois ?: Exibir a página de ajuda do tmux.
Comandos de Janela
C: Criar uma nova janela.
,: Renomear a janela atual.
W: Listar as janelas.
N: Mover para a próxima janela.

P: Ir para a janela anterior.

0 a 9: Ir para o número da janela especificado.
Comandos de Painel
%: Criar uma divisão horizontal.
“: Criar uma divisão vertical.
H ou seta para a esquerda: Mover para o painel à esquerda.
I ou Seta para a direita: Mover para o painel à direita.
J ou seta para baixo: Ir para o painel abaixo.
K ou seta para cima: Ir para o painel acima.
Q: Exibir brevemente os números dos painéis.
O: Mover entre os painéis por ordem. Cada clique leva-o para o próximo painel.
}: Trocar a posição do painel atual com o próximo.

{: Trocar a posição do painel atual com o anterior.

X: Fechar o painel atual.

Comparação entre Ambos

Em termos de funcionalidades, o `screen` e o tmux são semelhantes e oferecem as mesmas funcionalidades básicas. No entanto, a forma como acedemos a estas funcionalidades é significativamente diferente. O tmux oferece formas mais elegantes e convenientes de aceder às várias funções. Mas essa não é a única diferença.

A capacidade de renomear sessões e janelas no tmux é uma vantagem, e o facto de reter os painéis ao reconectar uma sessão é um fator crucial.

Por outro lado, o `screen` perde completamente os painéis quando uma sessão é desconectada e reconectada, o que pode ser bastante frustrante.

O tmux oferece muito mais, incluindo funcionalidades de scripting muito flexíveis. Vale a pena explorar todas as suas capacidades.