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
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.