Como personalizar o prompt da linha de comando no UNIX/Linux — parte 2

O prompt da linha de comando, que é exibido antes do cursor piscante, pode ser personalizado de diversas formas.
No texto anterior, mostrei algumas formas básicas de personalização.
Para dar continuidade, vou mostrar como inserir algumas informações úteis sobre o sistema, que podem ajudar você a se situar melhor no terminal.

Os exemplos foram testados no Linux (Debian 9, Fedora 25 e openSUSE Tumbleweed), mas você pode aplicá-los em outras distribuições ou em consoles UNIX, como os BSD ou próprio MacOS.

Clique nos links, no decorrer do texto, para obter mais informações sobre algum assunto específico.
Como já sabemos, a variável de ambiente a ser alterada é PS1 e ela pode ser mudada direto na linha de comando (CLI).
O que vou mostrar é que você pode usar uma série de caracteres de escape que exibem informações sobre o seu sistema.
Na parte 1 deste artigo, mostrei o uso de 2 caracteres de escape: \n e \a — para pular uma linha e para acionar o “sininho” do sistema, respectivamente.
Veja uma lista mais completa:

  • \a — aviso sonoro do sistema ou bell character
  • \d — exibe a data no formato nome do dia da semana, nome do mês e dia do mês. Por exemplo: “Tue May 26” (se o seu sistema estiver em inglês) ou “sáb mar 04” (em português).
  • \D{formatação} — neste caso, você precisa oferecer a formatação que deseja para a exibição da data. Se você não especificar o formato desejado, ele usará a representação padrão da localidade para a qual a sua máquina estiver configurada. De qualquer forma, você precisa usar as chaves {}, mesmo que vazias.
  • \e —  imprime um caractere de escape padrão. Muito usado para inserir informações sobre cores (como veremos mais pra frente).
  • \h —  o hostname do seu sistema ou nome parcial do hospedeiro (anfitrião).
  • \H —  o hostname completo.
  • \j —  o número de trabalhos (jobs) em execução e gerenciados pela shell neste momento.
  • \l —  o nome base do dispositivo de terminal.
  • \n —  insere uma nova linha.
  • \r —  um carriage return ou novo parágrafo.
  • \s —  o nome parcial da shell em execução.
  • \t —  a hora atual do sistema no formato 24h HH:MM:SS.
  • \T —  a hora atual do sistema no formato 12h HH:MM:SS.
  • \@ —  a hora atual do sistema no formato 12h am/pm.
  • \A —  a hora atual do sistema no formato 24h HH:MM.
  • \u —  o nome do usuário atual.
  • \v —  a versão da shell em execução.
  • \V —  a versão do release + patchlevel.
  • \w —  o diretório de trabalho atual, com $HOME abreviado para ” ~ “. Usa o valor da variável de ambiente $PROMPT_DIRTRIM.
  • \W —  o nome base do $PWD, com o $HOME abreviado.
  • \! —  o número desta linha de comando no histórico do sistema.
  • \# —  o número do comando em execução neste prompt.
  • \$ —  define o caractere do prompt a ser exibido. Se o uid for 0 (root), exibe um “#”. Para qualquer outro uid, exibe um “$”.
    Esta informação, no command prompt pode evitar que você execute comandos perigosos quando estiver logado como superusuário.
  • \nnn —  imprime o caractere cujo valor octal é igual a nnn.
  • \\ —  se você precisa de uma backslash
  • \[ —  inicia uma sequência de caracteres não-imprimíveis. Pode ser usado para embutir uma sequência de controle de terminal no seu prompt.
  • \] —  finaliza a sequência de caracteres não imprimíveis.

Exemplos de uso de caracteres de escape no prompt do terminal

Tendo a lista acima como referência, fica fácil alterar os exemplos que seguem, para obter o resultado que você deseja para personalizar o seu prompt.
Veja o nome do usuário junto com o caractere de identificação do uid:

PS1="\u \$ -> "

Não se esqueça de sair do modo root, com o comando exit.
Para imprimir o nome de usuário e o hostname ao lado do prompt, use os seguintes caracteres:

PS1="\u-\h -> "

Você pode incluir a data e a hora atuais em uma linha e o diretório atual em outra:

PS1="\d \t\n\W -> "

O resultado é um prompt em 2 linhas:

sáb mar 04 14:30:54
documentos ->

Não esqueça que o seu diretório home será representado por um “~” (til).
Você tem total liberdade para compor o seu prompt com outros caracteres:

PS1="«\d, \t »\n\u@\H «\w» "

Faça várias experiências para determinar como deseja que o seu prompt definitivo fique.

Como tornar as mudanças permanentes

Tudo o que você precisa é acrescentar a linha de configuração do PS1, que você acabou de criar, dentro de um dos arquivos de inicialização do Bash: o .bashrc ou o .bash_profile. Usualmente, é o primeiro.
Na maioria das distribuições Linux ou UNIX, esta a linha de configuração do PS1 já existe e só precisa ser alterada para o que você deseja.
Se não houver uma linha de configuração do PS1, adicione uma ao final do arquivo.
O comando echo pode ser usado, para introduzir a sua configuração direto na última linha do arquivo. Veja um exemplo:

echo "PS1='«\d, \t »\n\u@\H «\w» '" >> .bashrc

Repare em 3 coisas, relacionadas à linha de comando acima:

  1. o uso das aspas duplas e simples, para não confundir o comando.
  2. o uso de “>>” para adicionar a linha ao final do arquivo .bashrc. Se você usar apenas uma “>”, irá sobrescrever o arquivo inteiro com esta única linha de comando. Tenha cuidado, portanto.
  3. se já houver alguma configuração anterior, dentro do arquivo, ela será sempre sobreposta pela última linha adicionada.

Vamos dar um passo adiante?! Que tal personalizar também as cores do seu prompt?!

https://elias.praciano.com/2017/03/como-personalizar-o-prompt-da-linha-de-comando-no-unixlinux-parte-1/.
https://www.gnu.org/software/bash/manual/bashref.html#Controlling-the-Prompt.
http://www.linfo.org/uid.html.

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 1

Usuários Linux adoram personalizar seus sistemas e isto não é segredo.
Ao usar uma interface gráfica (GUI), isto fica fácil, com a escolha de um tema.
Mas, quando estamos usando um terminal (CLI), como fazer para obter um visual mais agradável e único?

Quando você precisa acessar outros servidores via ssh (às vezes, simultaneamente), pode ver utilidade em que cada um tenha um terminal com visual diferenciado. Desta forma, você sempre saberá em que servidor exatamente está executando algum comando.

Como o assunto pode ser um pouco extenso — calma, que não é nada complicado! 😉 — achei interessante dividir em mais de um post, para tornar a leitura mais agradável e passar o máximo de informações.
Há muitas maneiras de personalizar o seu console, no Linux/UNIX. Por este motivo, este texto vai se concentrar no command prompt, que é a parte que é exibida antes do cursor piscante.


Clique nos links, no decorrer do texto, para obter informações sobre algum assunto específico. A tag emulador de terminal, por exemplo, tem alguns textos que podem te interessar — não esqueça de dar uma olhada nas outras tags, no rodapé deste post, portanto!
fancy linux terminal
Nesta área, o sistema pode exibir uma série de informações, que você pode julgar importantes.
É possível exibir o nome do servidor ou host em que você está trabalhando, seu nome de usuário, a quantidade de processos em execução etc.
O limite é o bom senso — se você estender muito, vai acabar pecando pelo excesso.
Para mim, o mais importante, mesmo, é saber em que diretório precisamente estou executando algum comando.

Qual prompt de comando você quer alterar?

Caso você já não saiba, há vários command prompts possíveis, no Bash.
Veja a lista:

  • PS1 — os valores dados para este parâmetro são usados para determinar a aparência da principal string do prompt da linha de comando. Em algumas distribuições Linux/UNIX o valor padrão é “\s-\v\$ “.
  • PS2 — o valor padrão para a string do prompt secundário e “> “. Ele costuma aparecer quando é necessário complementar algum comando, dado na linha anterior.
    Digite echo " e tecle Enter, no seu terminal, para ver como é o seu PS2.
  • PS3 — é usado como prompt do comando select.
  • PS4 — o valor deste parâmetro é expandido, tal como o do PS1. Seu valor é imprimido na tela antes de cada comando que o bash exibe durante uma execution trace.
    O primeiro caractere do PS4 é replicado múltiplas vezes, de acordo com a necessidade, para indicar vários níveis. Seu valor padrão é “+”

Como você pode ver, os mais usados são o PS1 e o PS2. Os outros dois são bem raros para usuários comuns.
Neste artigo, vamos mostrar exemplos de configuração e uso do PS1.
Se quiser configurar os outros itens, basta seguir os mesmos procedimentos usados para configurar o PS1

Exemplos de prompt da linha de comando

Se quiser fazer uma experiência, agora, para alterar o seu prompt execute a seguinte linha de comando:

PS1="meu prompt -> "

e veja como ficou:

meu prompt -> 

Se quiser que ele fique com cara de Python Shell, use-o assim:

meu prompt -> PS1=" »»» "

»»»

Você pode inserir um Enter entre as aspas, para fazer uma mudança de linha — assim, você pode ter um prompt em 2 linhas ou mais. Para obter este mesmo efeito, pode usar o caractere tradicional de mudança de linha: \n. Veja como fica:

PS1=" digite um comando, abaixo:\n --> "

ps1 prompt command
Como você pode ver, quando o sistema encontra os caracteres \n, ele sabe que deve mudar de linha. Estes não serão impressos.
O Bash permite inserir diversos outros tipos de “caracteres não-imprimíveis” dentro do conteúdo de PS1. Experimente inserir o \a para obter um aviso sonoro no prompt, por exemplo.
Na próxima parte deste artigo, vamos mostrar como inserir informações básicas do sistema no prompt da linha de comando.

Como encontrar e instalar pacotes de softwares para FreeBSD com o pkg

A lista de aplicações disponíveis para FreeBSD cresce a cada dia.
Tal como em outros sistemas operacionais Unix-like, há várias maneiras de encontrar e instalar os pacotes de softwares que você precisa.
O FreeBSD, a exemplo de várias distribuições GNU/Linux, também seus sistemas de gestão de pacotes.

Como buscar os softwares disponíveis no repositório do FreeBSD

Se quiser fazer a busca por pacotes de softwares binários, dentro do repositório oficial, use o utilitário pkg.
Veja um exemplo:

pkg search tetris

Segue a relação de pacotes que contenham, em sua descrição, a string ‘tetris’:

patapizza-tetris-1.0_6         Unofficial clone of the original Tetris game
vitetris-0.57                  Terminal-based Tetris clone in vein of Nintendo Tetris

Na primeira coluna, vem o nome e a versão do pacote. Na segunda coluna, uma breve descrição.
Para obter a informação sobre a categoria a que cada pacote pertence, use a opção -o:

pkg search -o tetris 

Neste caso, todos os pacotes pertencem a categoria (origem) ‘jogos’ e a versão de cada um não será exibida na primeira coluna:

games/patapizza-tetris         Unofficial clone of the original Tetris game
games/vitetris                 Terminal-based Tetris clone in vein of Nintendo Tetris

Ao usar o ‘search’ simples, o gestor de pacotes pode oferecer informações sobre a versão da linguagem de programação (Python, PHP, Ruby, C etc.) sobre a qual aquele pacote foi construído.
No exemplo, abaixo:

pkg search subversion 
git-subversion-2.9.2           Distributed source code management tool with FreeBSD subversion bindings
java-subversion-1.9.4          Java bindings for Version control system
p5-subversion-1.9.4            Perl bindings for Version control system
py27-hgsubversion-1.8.6        Mercurial extension that allows using it as a Subversion client
py27-subversion-1.9.4          Python bindings for version control system
ruby-subversion-1.9.4          Ruby bindings for version control system

Recomendo usar o comando grep para filtrar resultados muito extensos e obter apenas o que necessita:

pkg search mp3 | grep player 
ksmp3play-0.5.2.1_4            Curses-based MP3 player
mp3blaster-3.2.5_5             MP3 console ncurses-based player
ximp3-0.1.15                   Simple console MP3 player

Tabulação no vim. Como indentar corretamente o seu código.

Este post é para aquelas pessoas que acreditam que a indentação é muito mais do que uma questão de mera estética.
Código bom, começa com uma boa indentação e comentários pertinentes.
Fora disso, é a barbárie! 😉
vim editor on kde
Há vários padrões de indentação, contudo. Alguns usuários preferem uma tabulação um pouco mais distante da margem, outros preferem um espaçamento menor entre uma tabulação e outra etc.
Neste post, vamos abordar como configurar o editor de textos vi, para organizar a tabulação do jeito que você acha melhor.
Veja alguns modelos populares de indentação:

  • Tabulações ou tabs com a largura de 8 colunas e cada nível de indentação corresponde a um tab — popular no kernel do Linux
  • Tabs com largura de 4 colunas e cada nível de indentação corresponde a um tab — comum entre desenvolvedores Windows (Visual Studio)
  • Cada nível de indentação tem 4 espaçamentos. A tabulação não é usada — comum entre programadores Java

Veja, a seguir, como ajustar cada item, direto na interface do programa e no arquivo de configurações.
Para teste, estamos usando o Ubuntu 16.04 LTS (também chamado Xenial Xerus)com a versão 7.4 do Vim.
Para saber qual a versão do aplicativo, use a opção ‘–version’:

vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 16 2016 10:50:38)

Conceitos de tabulação, indentação etc.

Vamos entender alguns conceitos e parâmetros, que podem ser usados para configurar a tabulação e a indentação dentro do texto.

  • tabstop —   determina quantas colunas são inseridas para cada vez que for pressionada a tecla Tab.
    É o único que afeta um texto já existente. Os outros, afetarão o texto que for escrito, daqui em diante.
  • expandtab —   quando ajustado, pressionar a tecla Tab, no modo de inserção, irá produzir o número apropriado de espaços.
  • shiftwidth —   controla quantas colunas e texto são indentadas com as operações de reindentações.
  • softtabstop —   controla quantas colunas o vim usa quando a tecla Tab é pressionada, no modo de inserção.
    Se o ‘softtabstop’ tem valor inferior ao ‘tabstop’ e o ‘expandtab’ não estiver ligado, o vim irá usar a combinação de tabulações e espaços para obter o espaçamento desejado.
    Se o ‘softabstop’ for igual ao ‘tabstop’ e o ‘expandtab’ não estiver ligado, o vim só usará tabulações.
    Quando o ‘expandtab’ estiver ligado, o vim irá usar sempre o número apropriado de espaços.

A melhor maneira de entender é experimentando. Vejamos alguns exemplos, fáceis de aplicar.
vim tab and indent

Indentação na vida real

Lembre-se, somente o ‘tabstop’, terá efeito imediato, dentro do texto que você for usar para aplicar os exemplos.
Os outros ajustes só terão efeitos perceptíveis, à medida em que você inserir texto novo.
O primeiro exemplo, reproduz o tipo mais usado por desenvolvedores do kernel Linux, de que já falamos acima.
Para obter tabulações com largura de 8 colunas e cada nível de indentação com uma só tabulação:

:set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab

O próximo exemplo, é o do Visual Studio.
Para obter tabulações com largura de 4 colunas e cada nível de indentação com uma só tabulação:

:set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab

Veja o exemplo de uso mais comum entre desenvolvedores Java — cada nível da indentação tem 4 espaços. Tabulações não são usadas:

:set softtabstop=4 shiftwidth=4 expandtab 

Segue mais 2 exemplos de ajuste da tabulação e indentação no vim.
No primeiro, ajustamos a tabulação para a largura de 8 colunas e cada nível de indentação em 3 colunas – que pode ser em espaços ou tabulações:

:set tabstop=8 softtabstop=3 shiftwidth=3 noexpandtab 

No segundo, o ajuste da tabulação fica em 5 colunas e o nível de indentação em 6 colunas — em espaços ou tabulações:

:set tabstop=5 softtabstop=6 shiftwidth=6 noexpandtab 

Me conte como você prefere configurar o seu editor vi ou vim.

O arquivo de configurações do vim

Depois de experimentar vários ajustes, você provavelmente irá escolher uma configuração para ser o padrão, para todos os novos arquivos.
Se você usa o Linux/UNIX, o arquivo de configurações é o ~/.vimrc. No Windows, ele fica em $HOME/_vimrc.
Se você usa a versão gráfica, gvim, pode acessar o painel de configurações, através do menu Editar.
Se o arquivo de configuração, não estiver presente no seu diretório home (no Linux), vocẽ pode copiar a versão “de fábrica”, /etc/vim/vimrc e alterá-la de acordo com as suas necessidades.
Uma outra alternativa é abrir o vim, já com estas opções ‘setadas’, dentro de um comentário. Veja um exemplo de comentário de primeira linha:

/* vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab : */ 

É importante deixar esta linha comentada, ou o seu compilador irá pensar que este código tem a ver com ele — o que poderá causar problemas para você.
Happy coding! 😉

Referências

http://tedlogan.com/techblog3.html.

Alternativas ao systemd

O systemd é mais um sistema init disponível para sistemas operacionais GNU/LINUX.
Diferente de outros, este é exclusivo de sistemas operacionais Unix-like que usam o kernel Linux.
Se você clicar na tag systemd, vai encontrar vários posts, neste site, sobre o assunto — inclusive um que fala muito mal dele (que coisa feia, Elias…) 😉
ssytemd emot carrousel
Neste texto, vamos abordar o conceito do init system, quais são as opções deste tipo de software e, por fim, conhecer algumas distribuições Linux que usam alternativas ao systemd — não vai dar pra falar de todas, por que são mais de 70.

O que é um init system

Em sistemas operacionais Unix-like, o init é o primeiro processo iniciado, durante a inicialização do sistema.
Init é abreviatura da palavra initialization.
É o ancestral direto ou indireto de todos os processos rodando no seu sistema, neste momento.
Ele adota todos os processos órfãos automaticamente.
O init é iniciado pelo kernel usando nome de arquivo hard-coded.
A principal causa do kernel panic é quando o init não pode ser carregado. Ele é tipicamente identificado como o PID 1.
O systemd é mais do que apenas um sistema init. Enquanto uns avaliam este fato como uma evolução do conceito, outras apontam nele um de seus maiores defeitos.

Alternativas ao systemd

Várias alternativas ao systemd estão disponíveis para uso da comunidade.
Segue uma relação (atual e relevante) de init systems, para Linux:

  • Bootscripts — comumente usado no GoboLinux
  • Initng — é um substituto atual para o UNIX System V init e para o Sysvinit (usado no Linux), escrito em C e lançado em 2005.
    Nas implementações tradicionais do init, processos são iniciados em ordem pre-determinada. Além disto, um processo só será iniciado, depois que o anterior estiver finalizado.
    O Initng inicia processos assim que suas dependências forem satisfeitas. Foi projetado para iniciar vários processos em paralelo e melhorar a velocidade de boot dos sistemas.
  • runit — Esquema init com supervisão de serviços. Concebido como substituto do SysVinit e outros projetos.
  • minit — Um init mínimo com supervisão de processos, ordenação de dependências de serviços, ativação de serviços paralelos etc.

Você vai encontrar mais itens na página do Wikipedia — fique atento para o fato de que alguns projetos estão mortos.

Distribuições Linux que usam outros init systems

Como disse, no começo, são muitas dezenas de opções. E ter opções, no mundo do software livre é importante.
Não vai dar para citar todas, contudo sugiro visitar o site without-systemd para ver uma relação mais completa.
O Distrowatch também tem uma relação de distribuições Linux que não usam o systemd.
Na lista, abaixo, separei uma relação de distribuições livres do systemd, que se destacam por diversos motivos:

  1. FreeBSD, OpenBSD etc — Os BSD não são Linux e não existe compatibilidade entre o systemd e estas distros — embora seja possível usá-los com o kernel Linux.
    O site tem vários posts sobre BSD, caso você se interesse.
  2. Slackware — no momento, a distro não aderiu ao systemd, mas não existe nenhum comprometimento do Patrick Volkerding no sentido de se manter distante deste sistema. Para quem gosta do Slackware, vale experimentar o Porteus — http://www.porteus.org/.
    Este projeto tem o comprometimento de seguir sem o systemd.
  3. Devuan — este é o projeto Debian, tocado por ex-integrantes que não concordaram com a mudança para o systemd. Veja mais no site http://devuan.org. Experimente também o Finnix, o Overclockix, o Trios, o Debian GNU/Hurd e o Debian KFreeBSD. Estes 2 últimos são opções para puristas e vale a pena conhecer.
  4. Tails — este é um projeto derivado do Debian e voltado para oferecer mais criptografia e segurança, com mais conforto para o usuário.
    Temos alguns textos, no site, mencionando este projeto.
  5. UbuntuBSD — como o nome indica, é baseado no Ubuntu e usa o núcleo do FreeBSD. Em vez do Unity, usa o ambiente gráfico XFCE. Também é uma opção interessante. Dá uma olhada no site oficial da distro: https://www.ubuntubsd.org/.
  6. Alpine Linux — Distro independente, de propósito genérico e projetada para power users.
    usea OpenRC como init systemhttp://www.alpinelinux.org/.
  7. Gentoo — Uma das distribuições mais conhecidas, que não se rendeu ao systemd — https://www.gentoo.org/.
  8. ReactOS — Tal como o Gentoo, trata-se de uma distro Linux, já estabelecida e com uma comunidade formada ao seu redor — https://www.reactos.org/.

Conhece alguma outra distro livre do systemd, que você gostaria de recomendar? Escreva nos comentários!

Referências

https://en.wikipedia.org/wiki/Init.
https://distrowatch.com/search.php?pkg=systemd&distrorange=NotInLatest#pkgsearch.
http://without-systemd.org/wiki/index.php/Main_Page#GNU.2FLinux_distributions.