O Ubuntu trocou de emulador de terminal padrão, e os dois mundos se personalizam de formas completamente diferentes: o GNOME Terminal guarda perfis no dconf/GSettings (automático via script), enquanto o Ptyxis usa arquivos de paleta em texto puro e configuração pela interface. Este guia cobre os dois cenários e a migração entre eles.
| Versão do Ubuntu | Terminal padrão | Personalização |
|---|---|---|
| 22.04 / 24.04 LTS e anteriores | GNOME Terminal | Script gsettings (seção 2) |
| 25.04 | GNOME Terminal | Script gsettings (mas o atalho Ctrl+Alt+T passou a usar xdg-terminal-exec) [1] |
| 25.10 | Ptyxis (substituiu o GNOME Terminal como padrão) [2] | Arquivos .palette + Preferências (seção 3) |
| 26.04 LTS | Ptyxis 50, com perfil por aba [3] | Arquivos .palette + Preferências (seção 3) |
Atenção ao marco de corte: a troca aconteceu no 25.10, não no 26.04 — o 26.04 LTS apenas consolida o Ptyxis (na versão 50) como padrão [2:1][3:1]. Quem atualizou de 24.04 direto para 26.04 pode ter os dois instalados: o script deste guia ainda funciona no GNOME Terminal, mas só faz efeito se ele for chamado explicitamente ou definido como padrão (seção 3.4).
O add_terminal_profile.sh cria perfis completos no GNOME Terminal via gsettings, com:
.bak executável, com os comandos gsettings para restaurar);--dry-run) para inspecionar as ações sem alterar nada;uuidgen, gsettings, jq, fc-match) e fallback de fonte (se a Nerd Font não estiver instalada, usa Monospace 12);--no-default).# 1. Dependências (Ubuntu/Debian)
sudo apt install uuid-runtime jq fontconfig
# 2. (Opcional) Fonte padrão do script
# Baixe "SauceCodePro Nerd Font" em https://www.nerdfonts.com e instale em ~/.local/share/fonts
fc-cache -fv
# 3. Simulação — sempre comece por aqui
./add_terminal_profile.sh --dry-run
# 4. Criar o perfil com o tema padrão (Graphite)
./add_terminal_profile.sh
# 5. Outro tema, outra fonte, sem definir como padrão
./add_terminal_profile.sh --theme nord --font "JetBrainsMono Nerd Font 13" --no-default
# 6. Listar temas disponíveis
./add_terminal_profile.sh --list-themes
Se um perfil com o mesmo nome já existir, o script pergunta antes de substituir e grava o backup em ~/terminal_profiles_backup/ (ou no diretório passado com --backup-dir). Para restaurar, basta executar o arquivo .bak gerado — ele contém os comandos gsettings set originais.
bash -n). Antes de usar em produção, rode --dry-run e teste em uma VM (checklist 12.3 do nosso guia de escrita).SauceCodePro Nerd Font Mono 14) exige instalação manual; sem ela, o script cai no fallback silenciosamente — confira o resumo exibido ao final.background-transparency-percent 5); para alterar, edite o valor no script ou ajuste depois em Preferências → Cores.cell-height-scale só é aplicado se a chave existir no seu GNOME Terminal (versões mais novas).O código completo do script está no anexo ao final desta página.
O Ptyxis não usa o esquema org.gnome.Terminal.Legacy.Profile — perfis e aparência vivem em outro modelo [4]:
| Aspecto | GNOME Terminal | Ptyxis |
|---|---|---|
| Cores | Editáveis na GUI e via GSettings/dconf | Arquivo .palette em texto puro (sem edição de cores na GUI) [4:1][5] |
| Local da configuração | dconf (binário) | ~/.local/share/org.gnome.Ptyxis/palettes/ [5:1] |
| Backup/migração | Exportar/importar dconf | Copiar os arquivos .palette — portabilidade nativa |
| Transparência | Controle na GUI | GSettings/dconf (sem controle na GUI) [6] |
| Perfis | Vários perfis, um padrão | Idem + perfil por aba (v50, Ubuntu 26.04) [3:2] |
Na prática, a personalização ficou mais simples de versionar: um arquivo INI por tema, que pode ir para o Git junto com os dotfiles.
.palette)O formato é GKeyFile (estilo INI), com seção [Palette] e as cores diretamente nela (tema único) ou separadas em [Light] e [Dark] — neste caso o terminal acompanha automaticamente o modo claro/escuro do sistema [5:2]. Chaves obrigatórias: Foreground, Background e Color0–Color15; opcionais com padrões calculados: Cursor, TitlebarBackground, SuperuserBackground (fundo quando root), RemoteBackground (fundo em SSH) [5:3].
Exemplo: o tema Graphite do script, portado para Ptyxis:
[Palette]
Name=Graphite
[Dark]
Foreground=#DADADA
Background=#1C1C1E
Cursor=#DADADA
CursorForeground=#1C1C1E
Color0=#1C1C1E
Color1=#E53E3E
Color2=#76C893
Color3=#F4A623
Color4=#159BEE
Color5=#A24BCF
Color6=#56C7D6
Color7=#EAEAEA
Color8=#3A3A3C
Color9=#FF6B6B
Color10=#88E4A2
Color11=#FFC857
Color12=#50B7F5
Color13=#BB6BD9
Color14=#70D8E0
Color15=#FFFFFF
Instalação (três caminhos equivalentes):
# A) Manual — instalação nativa (apt)
mkdir -p ~/.local/share/org.gnome.Ptyxis/palettes
cp graphite.palette ~/.local/share/org.gnome.Ptyxis/palettes/
# B) Assistente — Ptyxis 49+ instala no local correto sozinho
ptyxis --install-palette graphite.palette
# C) Arrastar o arquivo .palette para a janela de Preferências do Ptyxis
Se o Ptyxis foi instalado via Flatpak, o diretório é
~/.var/app/app.devsuite.Ptyxis/data/ptyxis/palettes/[6:1].
A paleta aparece imediatamente em ☰ → Preferências → Aparência → Mostrar todas as paletas, sem reiniciar o aplicativo [4:2]. As demais paletas do script (Nord, Gruvbox, Solarized, Tomorrow) já vêm de fábrica no Ptyxis, que traz mais de 200 paletas — a maioria importada do projeto Gogh [5:4].
O Ptyxis suporta transparência, mas não expõe o controle na interface — ajuste via GSettings usando o UUID do perfil ativo [6:2]:
# Instalação nativa (apt) — opacidade de 90% no perfil padrão
gsettings set org.gnome.Ptyxis.Profile:/org/gnome/Ptyxis/Profiles/$(gsettings get org.gnome.Ptyxis default-profile-uuid | tr -d "'")/ opacity 0.90
# Instalação Flatpak
flatpak run --command=gsettings app.devsuite.Ptyxis set org.gnome.Ptyxis.Profile:/org/gnome/Ptyxis/Profiles/$(flatpak run --command=gsettings app.devsuite.Ptyxis get org.gnome.Ptyxis default-profile-uuid | tr -d "'")/ opacity 0.90
Reinicie o Ptyxis para aplicar. O UUID de cada perfil também aparece em Preferências → Perfis → Editar [6:3].
Desde o Ubuntu 25.04, o atalho Ctrl+Alt+T é resolvido pelo xdg-terminal-exec, que lê ~/.config/ubuntu-xdg-terminals.list — a primeira linha válida vence [1:1]:
# Voltar ao GNOME Terminal como padrão
echo 'org.gnome.Terminal.desktop' > ~/.config/ubuntu-xdg-terminals.list
# Ptyxis abrindo sempre em janela nova (identificador XDG)
echo 'org.gnome.Ptyxis.desktop:new-window' > ~/.config/ubuntu-xdg-terminals.list
apt policy gnome-terminal ptyxis).--dry-run antes de aplicar..palette e backups de perfil versionados no Git junto aos dotfiles.#!/usr/bin/env bash
# add_terminal_profile.sh - Cria perfis personalizados para o GNOME Terminal
# Configurações de segurança: sair em caso de erro, variáveis não definidas ou pipefail
set -uo pipefail
# --- Funções de Log Coloridas ---
if [ -t 1 ]; then
BLUE='\e[34m'; YELLOW='\e[33m'; RED='\e[31m'; GREEN='\e[32m'; CYAN='\e[36m'; NC='\e[0m'
else
BLUE=''; YELLOW=''; RED=''; GREEN=''; CYAN=''; NC=''
fi
info() { echo -e "${BLUE}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERRO]${NC} $*" >&2; }
success() { echo -e "${GREEN}[SUCESSO]${NC} $*"; }
dryrun() { echo -e "${CYAN}[DRY-RUN]${NC} $*"; }
# --- Configurações padrão ---
DEFAULT_THEME="graphite"
DEFAULT_FONT="SauceCodePro Nerd Font Mono 14"
FALLBACK_FONT="Monospace 12"
SET_AS_DEFAULT=true
DRY_RUN=false
BACKUP_DIR="${BACKUP_DIR:-$HOME/terminal_profiles_backup}"
# --- Nova Função de Backup ---
backup_existing_profile() {
local profile_id="$1"
local profile_name="$2"
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_file="$BACKUP_DIR/${profile_name}_${profile_id}_${timestamp}.bak"
if [ "$DRY_RUN" = true ]; then
dryrun "Faria backup do perfil '$profile_name' ($profile_id) para $backup_file"
return 0
fi
info "Fazendo backup do perfil existente '$profile_name'..."
# Criar diretório de backup se não existir
mkdir -p "$BACKUP_DIR"
# Coletar todas as configurações do perfil
local profile_path="org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:${profile_id}/"
{
echo "# Backup do perfil do terminal GNOME"
echo "# Gerado em: $(date)"
echo "# Nome: $profile_name"
echo "# ID: $profile_id"
echo ""
# Listar todas as chaves e valores do perfil
gsettings list-recursively "$profile_path" | while read -r line; do
key=$(echo "$line" | cut -d' ' -f1)
value=$(echo "$line" | cut -d' ' -f2-)
echo "gsettings set \"$profile_path\" \"$key\" \"$value\""
done
} > "$backup_file"
if [ $? -eq 0 ]; then
success "Backup salvo em: $backup_file"
return 0
else
error "Falha ao criar backup do perfil"
return 1
fi
}
# --- Funções Auxiliares ---
check_dependencies() {
local missing_deps=()
for dep in uuidgen gsettings jq fc-match; do
if ! command -v "$dep" &> /dev/null; then
missing_deps+=("$dep")
fi
done
if [ ${#missing_deps[@]} -gt 0 ]; then
error "Dependências ausentes: ${missing_deps[*]}"
if [[ " ${missing_deps[*]} " =~ " jq " ]]; then
echo "Instale jq: sudo apt install jq (Ubuntu/Debian) ou sudo dnf install jq (Fedora)"
fi
if [[ " ${missing_deps[*]} " =~ " fc-match " ]]; then
echo "Instale fontconfig: sudo apt install fontconfig (Ubuntu/Debian)"
fi
exit 1
fi
}
check_font() {
local font_spec="$1"
local font_family=$(echo "$font_spec" | sed -E 's/ [0-9]+$//')
if fc-match "$font_family" >/dev/null 2>&1; then
info "Fonte '$font_family' encontrada."
return 0
else
warn "Fonte '$font_family' não encontrada."
return 1
fi
}
check_existing_profile() {
local profile_name_to_find="$1"
# Obtém a lista de IDs de perfil
local profile_ids=$(gsettings get org.gnome.Terminal.ProfilesList list | tr -d "[]'" | sed 's/,/ /g')
if [ -z "$profile_ids" ]; then
return 1
fi
set +e # Desativa o 'exit on error' temporariamente para o loop
for profile_id in $profile_ids; do
local path="org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:${profile_id}/"
# Obtém o nome do perfil, removendo as aspas simples da saída
local current_name=$(gsettings get "$path" visible-name 2>/dev/null | tr -d "'")
if [ "$current_name" = "$profile_name_to_find" ]; then
echo "$profile_id" # Retorna o ID do perfil encontrado
set -e
return 0
fi
done
set -e # Reativa o 'exit on error'
return 1 # Nenhum perfil encontrado
}
run() {
local cmd_output
if [ "$DRY_RUN" = true ]; then
dryrun "Executaria: $*"
else
if ! cmd_output="$("$@" 2>&1)"; then
error "Comando falhou: $*\nSaída: $cmd_output"
exit 1
fi
fi
}
show_summary() {
success "Perfil terminal configurado:"
echo " Nome: $NAME"
echo " ID: $PROFILE_ID"
echo " Tema: $THEME"
echo " Fonte: $FONT"
echo " Cor de fundo: $BG_COLOR"
echo " Cor do texto: $FG_COLOR"
if [ "$SET_AS_DEFAULT" = true ]; then
echo " Status: Definido como padrão"
fi
}
# Definir paletas de cores para diferentes temas
declare -A THEMES
THEMES[graphite]='{
"name": "Graphite",
"bg": "#1C1C1E",
"fg": "#DADADA",
"cursor": "#1C1C1E",
"cursor_bg": "#DADADA",
"palette": "['\''#1C1C1E'\'', '\''#E53E3E'\'', '\''#76C893'\'', '\''#F4A623'\'', '\''#159BEE'\'', '\''#A24BCF'\'', '\''#56C7D6'\'', '\''#EAEAEA'\'', '\''#3A3A3C'\'', '\''#FF6B6B'\'', '\''#88E4A2'\'', '\''#FFC857'\'', '\''#50B7F5'\'', '\''#BB6BD9'\'', '\''#70D8E0'\'', '\''#FFFFFF'\'']"
}'
THEMES[solarized]='{
"name": "Solarized Dark",
"bg": "#002b36",
"fg": "#839496",
"cursor": "#1C1C1E",
"cursor_bg": "#DADADA",
"palette": "['\''#002b36'\'', '\''#dc322f'\'', '\''#859900'\'', '\''#b58900'\'', '\''#268bd2'\'', '\''#d33682'\'', '\''#2aa198'\'', '\''#839496'\'', '\''#073642'\'', '\''#cb4b16'\'', '\''#586e75'\'', '\''#657b83'\'', '\''#93a1a1'\'', '\''#6c71c4'\'', '\''#eee8d5'\'', '\''#fdf6e3'\'']"
}'
THEMES[nord]='{
"name": "Nord",
"bg": "#2E3440",
"fg": "#D8DEE9",
"cursor": "#1C1C1E",
"cursor_bg": "#DADADA",
"palette": "['\''#2E3440'\'', '\''#BF616A'\'', '\''#A3BE8C'\'', '\''#EBCB8B'\'', '\''#81A1C1'\'', '\''#B48EAD'\'', '\''#88C0D0'\'', '\''#E5E9F0'\'', '\''#4C566A'\'', '\''#BF616A'\'', '\''#A3BE8C'\'', '\''#EBCB8B'\'', '\''#81A1C1'\'', '\''#B48EAD'\'', '\''#8FBCBB'\'', '\''#ECEFF4'\'']"
}'
THEMES[gruvbox]='{
"name": "Gruvbox Dark",
"bg": "#282828",
"fg": "#ebdbb2",
"cursor": "#1C1C1E",
"cursor_bg": "#DADADA",
"palette": "['\''#282828'\'', '\''#cc241d'\'', '\''#98971a'\'', '\''#d79921'\'', '\''#458588'\'', '\''#b16286'\'', '\''#689d6a'\'', '\''#a89984'\'', '\''#928374'\'', '\''#fb4934'\'', '\''#b8bb26'\'', '\''#fabd2f'\'', '\''#83a598'\'', '\''#d3869b'\'', '\''#8ec07c'\'', '\''#ebdbb2'\'']"
}'
THEMES[tomorrow]='{
"name": "Tomorrow Night",
"bg": "#1d1f21",
"fg": "#c5c8c6",
"cursor": "#1C1C1E",
"cursor_bg": "#DADADA",
"palette": "['\''#1d1f21'\'', '\''#cc6666'\'', '\''#b5bd68'\'', '\''#f0c674'\'', '\''#81a2be'\'', '\''#b294bb'\'', '\''#8abeb7'\'', '\''#c5c8c6'\'', '\''#969896'\'', '\''#cc6666'\'', '\''#b5bd68'\'', '\''#f0c674'\'', '\''#81a2be'\'', '\''#b294bb'\'', '\''#8abeb7'\'', '\''#ffffff'\'']"
}'
# Função para mostrar uso
show_usage() {
echo "Uso: $0 [OPÇÕES]"
echo "Cria um perfil personalizado no GNOME Terminal."
echo ""
echo "Opções:"
echo " -t, --theme TEMA Escolhe o tema (padrão: $DEFAULT_THEME)"
echo " -f, --font FONTE Define a fonte (padrão: '$DEFAULT_FONT')"
echo " -l, --list-themes Lista temas disponíveis"
echo " -n, --dry-run Mostra o que seria feito sem executar"
echo " --no-default Não define o perfil criado como padrão"
echo " -b, --backup-dir DIR Diretório para backup de perfis existentes"
echo " -h, --help Mostra esta ajuda"
echo ""
echo "Temas disponíveis: ${!THEMES[@]}"
}
# Função para listar temas
list_themes() {
echo "Temas disponíveis:"
for theme in "${!THEMES[@]}"; do
theme_name=$(echo "${THEMES[$theme]}" | jq -r '.name')
echo " $theme: $theme_name"
done
}
# Processar argumentos
THEME=$DEFAULT_THEME
FONT=$DEFAULT_FONT
while [[ $# -gt 0 ]]; do
case $1 in
-t|--theme) THEME="$2"; shift 2 ;;
-f|--font) FONT="$2"; shift 2 ;;
-l|--list-themes) list_themes; exit 0 ;;
-n|--dry-run) DRY_RUN=true; shift ;;
--no-default) SET_AS_DEFAULT=false; shift ;;
-b|--backup-dir) BACKUP_DIR="$2"; shift 2 ;;
-h|--help) show_usage; exit 0 ;;
*) error "Opção desconhecida: $1"; show_usage; exit 1 ;;
esac
done
# Verificar dependências
check_dependencies
# Verificar se o tema existe
if [[ -z "${THEMES[$THEME]+x}" ]]; then
error "Tema '$THEME' não encontrado!"
list_themes
exit 1
fi
# --- MELHORIA: Extrair configurações do tema com uma única chamada `jq` ---
# Usa `eval` para atribuir as saídas do `jq` a variáveis de shell.
# O formato `@sh` do jq garante que a saída seja segura para o shell.
eval "$(echo "${THEMES[$THEME]}" | jq -r '@sh "NAME=\(.name) BG_COLOR=\(.bg) FG_COLOR=\(.fg) CURSOR_COLOR=\(.cursor) CURSOR_BG_COLOR=\(.cursor_bg) PALETTE=\(.palette)"')"
# Verificar se a fonte está instalada
if ! check_font "$FONT"; then
warn "Usando fonte fallback: $FALLBACK_FONT"
FONT=$FALLBACK_FONT
if ! check_font "$FONT"; then
error "Fonte fallback também não encontrada!"
exit 1
fi
fi
# Verificar se perfil já existe
info "Verificando se o perfil '$NAME' já existe..."
EXISTING_PROFILE=$(check_existing_profile "$NAME")
if [ -n "$EXISTING_PROFILE" ]; then
warn "Perfil '$NAME' já existe com ID: $EXISTING_PROFILE"
read -p "Deseja substituir? (s/N) " -n 1 -r
echo
if [[ $REPLY =~ ^[Ss]$ ]]; then
# Fazer backup do perfil existente antes de substituir
if ! backup_existing_profile "$EXISTING_PROFILE" "$NAME"; then
error "Falha ao fazer backup do perfil existente. Abortando."
exit 1
fi
PROFILE_ID="$EXISTING_PROFILE"
info "Substituindo perfil existente: $PROFILE_ID"
else
info "Adicionando novo perfil com sufixo..."
NAME="${NAME} $(date +%H%M%S)"
EXISTING_PROFILE="" # Forçar criação de novo perfil
fi
else
info "Nenhum perfil existente encontrado com o nome '$NAME'"
fi
# Criar novo perfil se não existir
if [ -z "${EXISTING_PROFILE}" ]; then
info "Iniciando criação de novo perfil..."
if [ "$DRY_RUN" = true ]; then
PROFILE_ID="dry-run-uuid-$(date +%s)"
dryrun "Geraria UUID: $PROFILE_ID"
else
PROFILE_ID=$(uuidgen)
info "Novo UUID gerado: $PROFILE_ID"
fi
# --- MELHORIA: Manipulação robusta da lista de perfis ---
# Lê a lista atual, converte para um array bash
current_list_str=$(gsettings get org.gnome.Terminal.ProfilesList list | tr -d "[]'" | sed 's/,/ /g')
current_list=($current_list_str)
# Adiciona o novo ID ao array
current_list+=("$PROFILE_ID")
# Constrói a string da nova lista no formato que o gsettings espera: ['id1', 'id2']
new_list_str="["
first=true
for id in "${current_list[@]}"; do
if [ "$first" = true ]; then
new_list_str+="'$id'"
first=false
else
new_list_str+=", '$id'"
fi
done
new_list_str+="]"
run gsettings set org.gnome.Terminal.ProfilesList list "$new_list_str"
else
PROFILE_ID="$EXISTING_PROFILE"
fi
PROFILE_PATH="org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:${PROFILE_ID}/"
info "Aplicando configurações do perfil..."
# Configurações do perfil
run gsettings set "$PROFILE_PATH" visible-name "$NAME"
run gsettings set "$PROFILE_PATH" background-color "$BG_COLOR"
run gsettings set "$PROFILE_PATH" foreground-color "$FG_COLOR"
run gsettings set "$PROFILE_PATH" palette "$PALETTE"
run gsettings set "$PROFILE_PATH" font "$FONT"
run gsettings set "$PROFILE_PATH" use-system-font false
run gsettings set "$PROFILE_PATH" use-theme-colors false
run gsettings set "$PROFILE_PATH" cursor-colors-set true
run gsettings set "$PROFILE_PATH" cursor-foreground-color "$CURSOR_COLOR"
run gsettings set "$PROFILE_PATH" cursor-background-color "$CURSOR_BG_COLOR"
run gsettings set "$PROFILE_PATH" cursor-blink-mode 'on'
# Transparência personalizada
run gsettings set "$PROFILE_PATH" use-theme-transparency false
run gsettings set "$PROFILE_PATH" use-transparent-background true
run gsettings set "$PROFILE_PATH" background-transparency-percent 5
# Espaçamento de texto (se suportado)
if gsettings list-recursively | grep -q "cell-height-scale"; then
run gsettings set "$PROFILE_PATH" cell-height-scale 1.1
fi
# Define como padrão, se aplicável
if [ "$SET_AS_DEFAULT" = true ]; then
run gsettings set org.gnome.Terminal.ProfilesList default "$PROFILE_ID"
fi
# Mostrar resumo
show_summary
if [ "$DRY_RUN" = true ]; then
warn "MODO SIMULAÇÃO - Nenhuma alteração foi feita"
fi
Ubuntu Desktop documentation — Change the default terminal — xdg-terminal-exec e ~/.config/ubuntu-xdg-terminals.list a partir do Ubuntu 25.04. ↩︎ ↩︎
It's FOSS — Ubuntu 25.10 will Have a Brand New Terminal — Ptyxis substitui o GNOME Terminal como padrão no Ubuntu 25.10. ↩︎ ↩︎
Ubuntu Handbook — Ptyxis 50 adds Per-Tab Profile Support — Ptyxis 50 no Ubuntu 26.04 LTS, perfil por aba, cell-width-scale e acentos do sistema nas paletas. ↩︎ ↩︎ ↩︎
Ask Ubuntu — Modifying or adding new palettes to Ptyxis — sem edição de cores na GUI; instalação por arrastar-e-soltar; efeito imediato sem reiniciar. ↩︎ ↩︎ ↩︎
Manpage ptyxis(1) — Palette Files — formato .palette, chaves obrigatórias e opcionais, diretório ~/.local/share/org.gnome.Ptyxis/palettes/. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
MintGuide Community Wiki — Ptyxis — caminho de paletas no Flatpak, --install-palette (v49+) e ajuste de opacity via GSettings. ↩︎ ↩︎ ↩︎ ↩︎