<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sistemas Operacionais - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/categorias/sistemas-operacionais/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Thu, 24 Jul 2025 22:20:56 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>Sistemas Operacionais - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>A Arquitetura de 32 bits vs 64 bits em Sistemas Operacionais Linux</title>
		<link>https://mcu.tec.br/sistemas-operacionais/a-arquitetura-de-32-bits-vs-64-bits-em-sistemas-operacionais-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-arquitetura-de-32-bits-vs-64-bits-em-sistemas-operacionais-linux</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 24 Jul 2025 22:20:54 +0000</pubDate>
				<category><![CDATA[Sistemas Operacionais]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=600</guid>

					<description><![CDATA[<p>Descubra as diferenças entre sistemas operacionais de 32 e 64 bits no Linux embarcado, com foco no Raspberry Pi e no Yocto Project. Entenda os impactos no desempenho, na memória, na compatibilidade de programas e na programação em C e C++.</p>
<p>The post <a href="https://mcu.tec.br/sistemas-operacionais/a-arquitetura-de-32-bits-vs-64-bits-em-sistemas-operacionais-linux/">A Arquitetura de 32 bits vs 64 bits em Sistemas Operacionais Linux</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">A transição de sistemas operacionais e processadores de 32 bits para 64 bits tem sido um marco importante na evolução da computação, refletindo diretamente no desempenho, na capacidade de processamento e na organização da memória. Em ambientes embarcados e de computação pessoal como o Raspberry Pi, essa diferença se tornou cada vez mais relevante, especialmente com a popularização de sistemas baseados em ARM64, como o Raspberry Pi 4 e superiores.</p>



<p class="wp-block-paragraph">No contexto de sistemas operacionais baseados em Linux — como as distribuições especializadas para Raspberry Pi e as geradas com o Yocto Project — compreender essa transição não se resume apenas a saber &#8220;qual arquitetura estou usando&#8221;, mas envolve entender como isso afeta o desenvolvimento de software em C/C++, a compatibilidade entre programas, o uso eficiente da memória e o desempenho geral do sistema.</p>



<p class="wp-block-paragraph">O Yocto Project, por sua vez, oferece uma infraestrutura poderosa para a construção de distribuições Linux personalizadas, permitindo ao desenvolvedor escolher entre alvos de 32 ou 64 bits, otimizando bibliotecas, pacotes e kernels para diferentes arquiteturas. Com isso, torna-se possível construir desde sistemas minimalistas para controladores até plataformas multimídia robustas que exploram todo o potencial de um processador de 64 bits.</p>



<p class="wp-block-paragraph">Nesta série de seções, analisaremos detalhadamente:</p>



<ul class="wp-block-list">
<li>As diferenças fundamentais entre sistemas de 32 e 64 bits;</li>



<li>Os requisitos de hardware para suportá-los;</li>



<li>O impacto no desenvolvimento de programas em C/C++;</li>



<li>A compatibilidade e intercambialidade entre programas 32/64 bits;</li>



<li>Como a arquitetura influencia o desempenho e a organização da memória.</li>
</ul>



<h2 class="wp-block-heading">Arquiteturas 32 bits vs 64 bits: Conceitos Técnicos e Limitações</h2>



<p class="wp-block-paragraph">A principal distinção entre arquiteturas de 32 e 64 bits está na largura dos registradores do processador — estruturas internas usadas para manipular dados e endereçar a memória. Em processadores de 32 bits, cada registrador tem capacidade para armazenar até 4 bytes (32 bits), o que permite endereçar no máximo 4 GB de memória diretamente. Já nos de 64 bits, os registradores podem manipular 8 bytes (64 bits), o que eleva esse limite teórico de endereçamento para 16 exabytes (2⁶⁴ endereços).</p>



<p class="wp-block-paragraph">Na prática, esse aumento de largura traz várias consequências:</p>



<ol class="wp-block-list">
<li><strong>Capacidade de memória</strong>: Sistemas operacionais de 64 bits podem utilizar mais de 4 GB de RAM, o que é fundamental para aplicações modernas, como bancos de dados, softwares gráficos e sistemas embarcados com múltiplas tarefas pesadas. Em contrapartida, sistemas de 32 bits precisam usar técnicas como PAE (Physical Address Extension) para acessar mais memória, com complexidade adicional.</li>



<li><strong>Tamanho dos tipos de dados</strong>: Em linguagens como C/C++, os tipos de dados dependem da arquitetura. Por exemplo, <code>long</code> e <code>pointers</code> têm 4 bytes em 32 bits e 8 bytes em 64 bits. Isso influencia diretamente o uso de memória, alinhamento de dados e estruturas complexas, afetando tanto o desempenho quanto a compatibilidade.</li>



<li><strong>Conjunto de instruções</strong>: Arquiteturas de 64 bits incluem novas instruções que otimizam operações com grandes volumes de dados. Em ARM64 (AArch64), por exemplo, há melhorias específicas para DSP (Processamento de Sinais Digitais), criptografia e acesso paralelo à memória.</li>



<li><strong>Registradores adicionais</strong>: Os processadores de 64 bits geralmente trazem mais registradores gerais e vetoriais, o que aumenta a eficiência em loops e chamadas de função, reduzindo o overhead de acesso à memória RAM.</li>
</ol>



<p class="wp-block-paragraph">No caso do Raspberry Pi, modelos anteriores como o Pi 2 utilizam processadores ARM Cortex-A7 (32 bits), enquanto o Raspberry Pi 3 e 4 usam Cortex-A53 ou superiores, com suporte completo a ARM64. Mesmo assim, muitas distribuições Linux para Raspberry Pi continuam oferecendo versões 32 bits por motivos de compatibilidade e menor consumo de memória.</p>



<p class="wp-block-paragraph">A partir dessa base técnica, torna-se evidente que a escolha entre 32 e 64 bits deve considerar não apenas o hardware disponível, mas também o tipo de aplicação e os requisitos de desempenho. No Yocto Project, isso se reflete na seleção de <code>MACHINE</code> e <code>TUNE_FEATURES</code> durante a configuração, influenciando diretamente o kernel e os binários gerados.</p>



<h2 class="wp-block-heading">Requisitos de Hardware e SBCs Compatíveis com Sistemas de 64 Bits</h2>



<p class="wp-block-paragraph">Para executar um sistema operacional de 64 bits, o primeiro requisito essencial é que o processador seja compatível com essa arquitetura. Isso significa que ele deve suportar um conjunto de instruções de 64 bits — no caso de sistemas ARM, isso se traduz em suporte ao modo <em>AArch64</em>. No universo dos Single-Board Computers (SBCs), como o Raspberry Pi, essa capacidade está presente a partir da linha com processadores ARM Cortex-A53 (Raspberry Pi 3) e posteriores.</p>



<p class="wp-block-paragraph">Além da arquitetura do processador, outros fatores devem ser considerados:</p>



<ol class="wp-block-list">
<li><strong>Firmware compatível</strong>: O bootloader precisa ser capaz de inicializar o sistema em modo 64 bits. No Raspberry Pi, isso depende do firmware instalado na partição de boot e da forma como o kernel é compilado. Distribuições como o Raspberry Pi OS oferecem versões separadas para 32 e 64 bits, e o usuário pode alternar manualmente desde que o hardware suporte.</li>



<li><strong>Memória RAM suficiente</strong>: Embora seja tecnicamente possível executar um sistema de 64 bits com apenas 512 MB de RAM, o ideal é contar com pelo menos 1 GB para que os benefícios da nova arquitetura superem o overhead adicional. Isso porque ponteiros e estruturas ocupam mais espaço em 64 bits, o que pode, em sistemas muito limitados, levar ao efeito inverso ao desejado: mais consumo e menos desempenho.</li>



<li><strong>Dispositivos periféricos e drivers</strong>: Alguns drivers específicos de hardware podem não ter suporte em ambientes 64 bits, especialmente em sistemas minimalistas gerados via Yocto. É comum, em projetos customizados, ter que incluir manualmente suporte a dispositivos como sensores, câmeras ou módulos de comunicação. Isso exige que os binários dos módulos sejam compilados para a mesma arquitetura do kernel — 32 ou 64 bits — e que o sistema de build (como o BitBake do Yocto) esteja corretamente configurado para tal.</li>



<li><strong>Compatibilidade com bibliotecas e software legado</strong>: SBCs com foco educacional e de prototipagem, como o Raspberry Pi, muitas vezes utilizam bibliotecas legadas em 32 bits. Executar um sistema 64 bits em tais dispositivos pode requerer a inclusão de bibliotecas <em>multilib</em> para manter a compatibilidade com esses pacotes, o que será abordado em mais detalhes na próxima seção.</li>
</ol>



<p class="wp-block-paragraph">O Yocto Project, por sua flexibilidade, permite configurar <em>toolchains</em>, <em>root filesystems</em> e <em>kernels</em> otimizados para a arquitetura específica do SBC. Isso significa que é possível gerar uma imagem 64 bits para o Raspberry Pi 4, ou mesmo uma imagem híbrida com suporte a execução de binários 32 bits em modo compatível, desde que todas as dependências estejam corretamente especificadas no ambiente de build.</p>



<h2 class="wp-block-heading">Intercambialidade entre Aplicativos 32 e 64 Bits no Linux</h2>



<p class="wp-block-paragraph">Uma das vantagens do Linux, especialmente em arquiteturas baseadas em ARM e x86, é sua flexibilidade quanto à execução de binários de diferentes arquiteturas, desde que o sistema esteja adequadamente configurado. Isso inclui a possibilidade de executar aplicativos de 32 bits em sistemas operacionais de 64 bits, o que é particularmente útil para manter compatibilidade com softwares legados ou bibliotecas ainda não portadas.</p>



<p class="wp-block-paragraph">Para que essa intercambialidade funcione corretamente, algumas condições devem ser atendidas:</p>



<ol class="wp-block-list">
<li><strong>Presença de bibliotecas de 32 bits no sistema</strong>: Um programa compilado para 32 bits exigirá bibliotecas (<code>libc</code>, <code>libm</code>, etc.) também em 32 bits. Em distribuições como o Debian ou Raspberry Pi OS 64 bits, é possível instalar essas versões usando pacotes como <code>libc6:i386</code> ou equivalentes ARM. No contexto do Yocto, o uso de camadas <em>multilib</em> permite gerar versões paralelas de bibliotecas para ambas as arquiteturas, controlando isso por meio das variáveis <code>MULTILIBS</code> e <code>DEFAULTTUNE</code>.</li>



<li><strong>Suporte no kernel Linux</strong>: O kernel precisa estar compilado com suporte a binários ELF de 32 bits. Isso geralmente já é padrão em builds para ARM64. Quando ativado, o kernel será capaz de interpretar e carregar binários de 32 bits sem problemas, desde que suas dependências estejam no lugar.</li>



<li><strong>Estrutura de arquivos separada ou unificada</strong>: Em sistemas minimalistas, pode-se optar por separar claramente os arquivos 32 e 64 bits, usando diretórios como <code>/lib</code> e <code>/lib32</code>. Já em sistemas baseados em Yocto, isso pode ser rigidamente controlado no momento da construção da imagem, facilitando a criação de ambientes limpos e otimizados para casos de uso específicos.</li>



<li><strong>Execução cruzada de binários</strong>: É importante destacar que o inverso — executar binários de 64 bits em sistemas operacionais de 32 bits — não é possível. Isso ocorre porque o sistema operacional de 32 bits não possui suporte para registradores, instruções ou endereçamento da arquitetura de 64 bits.</li>
</ol>



<p class="wp-block-paragraph">No caso do Raspberry Pi, é comum ver sistemas operacionais de 64 bits que mantêm suporte a bibliotecas e aplicativos 32 bits como forma de garantir compatibilidade. Isso permite rodar jogos, ferramentas de automação e até mesmo sistemas embarcados desenvolvidos para versões anteriores do hardware.</p>



<p class="wp-block-paragraph">Assim, a intercambialidade no Linux não é apenas uma possibilidade, mas uma estratégia prática e madura, especialmente quando empregada com ferramentas como o Yocto Project, onde o controle fino da arquitetura de cada pacote facilita a geração de imagens mistas ou compatíveis com aplicações legadas.</p>



<h2 class="wp-block-heading">Impacto no Desempenho e no Processamento de Dados</h2>



<p class="wp-block-paragraph">A migração para arquiteturas de 64 bits não está apenas relacionada à capacidade de endereçamento de memória, mas também traz ganhos substanciais de desempenho em diversas classes de aplicação, especialmente quando o sistema é bem projetado e o software está otimizado para essa arquitetura.</p>



<h3 class="wp-block-heading">1. <strong>Manipulação de dados maiores</strong></h3>



<p class="wp-block-paragraph">Processadores de 64 bits podem lidar com inteiros e ponteiros de 64 bits em uma única operação, o que é especialmente benéfico em cálculos que envolvem grandes faixas de números, como algoritmos criptográficos, processamento de sinais e operações em banco de dados. Além disso, estruturas de dados como vetores, matrizes e buffers podem ser percorridas mais rapidamente se o compilador conseguir explorar os registradores mais largos.</p>



<h3 class="wp-block-heading">2. <strong>Mais registradores e instruções otimizadas</strong></h3>



<p class="wp-block-paragraph">Arquiteturas modernas de 64 bits — como o ARMv8-A usado nos Raspberry Pi 3/4 — trazem conjuntos de instruções mais eficientes e um número maior de registradores de propósito geral e vetoriais. Isso reduz o número de acessos à memória RAM e permite que mais variáveis fiquem em registradores, aumentando a velocidade dos loops e a performance geral do sistema.</p>



<h3 class="wp-block-heading">3. <strong>Impacto no uso de memória</strong></h3>



<p class="wp-block-paragraph">Apesar do aumento de desempenho, há um custo em termos de uso de memória: ponteiros maiores, alinhamento de dados mais rígido e estruturas maiores podem levar a um consumo maior de RAM, especialmente em programas que utilizam intensamente ponteiros, como navegadores ou ambientes gráficos. Em sistemas embarcados com recursos limitados, isso pode anular parcialmente os ganhos de desempenho se não for bem gerenciado.</p>



<h3 class="wp-block-heading">4. <strong>Execução de programas otimizados via Yocto</strong></h3>



<p class="wp-block-paragraph">No contexto do Yocto Project, é possível tirar o máximo proveito da arquitetura escolhida: o desenvolvedor pode compilar programas com <em>tuning</em> específico (como <code>cortexa53-64</code>), ativar otimizações como <em>NEON</em>, <em>LTO</em> (Link Time Optimization) e <em>Hard Float ABI</em>, e até gerar pacotes com vetores SIMD de 128 bits via extensões ARMv8. Tudo isso contribui para um sistema leve, rápido e adaptado ao hardware-alvo.</p>



<p class="wp-block-paragraph">Em benchmarks comparativos, é comum que aplicações otimizadas para 64 bits tenham desempenho até 30% superior às mesmas versões em 32 bits, especialmente em cargas pesadas como:</p>



<ul class="wp-block-list">
<li>Compressão/descompressão de arquivos (gzip, bzip2);</li>



<li>Renderização de gráficos;</li>



<li>Machine Learning com bibliotecas otimizadas (TensorFlow Lite, Arm NN);</li>



<li>Criptografia com OpenSSL;</li>



<li>Processamento de vídeo em tempo real com GStreamer.</li>
</ul>



<p class="wp-block-paragraph">Resumidamente, o impacto no desempenho pode ser altamente positivo quando se aproveitam as vantagens arquiteturais da plataforma, principalmente com ferramentas como Yocto, que permitem controlar cada detalhe do sistema operacional e do ambiente de execução.</p>



<h2 class="wp-block-heading">Organização da Memória e Efeitos na Programação em C/C++</h2>



<p class="wp-block-paragraph">A transição de um sistema operacional de 32 para 64 bits impacta significativamente a maneira como a memória é organizada e acessada, e isso reflete diretamente na programação em linguagens como C e C++, que expõem ao desenvolvedor o controle sobre tipos de dados, ponteiros e alinhamentos.</p>



<h3 class="wp-block-heading">1. <strong>Endereçamento de memória</strong></h3>



<p class="wp-block-paragraph">Em um sistema de 32 bits, o espaço de endereçamento virtual é limitado a 4 GB por processo (2³² endereços possíveis). Já em sistemas de 64 bits, esse limite salta para até 16 exabytes (2⁶⁴), embora na prática o kernel limite esse espaço a faixas mais razoáveis, como 256 TB. Isso permite que processos lidem com arquivos muito maiores na memória, buffers extensos e mapeamento direto de dispositivos ou memória de vídeo — essencial para aplicações multimídia, bancos de dados embarcados e sistemas de cache complexos.</p>



<p class="wp-block-paragraph">No C/C++, isso significa que ponteiros (<code>void*</code>, <code>char*</code>, etc.) ocupam 4 bytes em 32 bits e 8 bytes em 64 bits, afetando a memória consumida por estruturas que os contêm. Além disso, o compilador precisa alinhar os dados corretamente (geralmente em múltiplos de 8 bytes para 64 bits), o que pode causar <em>padding</em> e aumentar o tamanho total de structs.</p>



<h3 class="wp-block-heading">2. <strong>Tipos de dados e <code>sizeof</code></strong></h3>



<p class="wp-block-paragraph">A tabela a seguir mostra como alguns tipos padrão variam conforme a arquitetura:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Tipo em C/C++</th><th>32 bits</th><th>64 bits</th></tr></thead><tbody><tr><td><code>int</code></td><td>4 bytes</td><td>4 bytes</td></tr><tr><td><code>long</code></td><td>4 bytes</td><td>8 bytes (*)</td></tr><tr><td><code>void*</code></td><td>4 bytes</td><td>8 bytes</td></tr><tr><td><code>size_t</code></td><td>4 bytes</td><td>8 bytes</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">(*) Depende da ABI: em LP64 (Linux), <code>long</code> tem 8 bytes; em LLP64 (Windows), <code>long</code> continua com 4.</p>



<p class="wp-block-paragraph">Isso afeta diretamente programas que assumem tamanhos fixos de dados, o que é comum em drivers, protocolos e estruturas de rede. Um código C portado de 32 para 64 bits pode se comportar de maneira diferente se usar <code>int</code> para índices de arrays muito grandes, ou se confiar em <code>sizeof(long)</code> para operações de leitura binária.</p>



<h3 class="wp-block-heading">3. <strong>Cuidados com compatibilidade e <em>casting</em></strong></h3>



<p class="wp-block-paragraph">Erros sutis podem surgir em programas que fazem <em>casting</em> entre tipos de tamanhos diferentes, como converter um ponteiro para <code>int</code>, o que pode funcionar em 32 bits mas corromper o valor em 64 bits. Outro problema clássico é o uso de <code>printf</code> com especificadores incorretos (<code>%lu</code>, <code>%p</code>), que pode causar truncamentos e comportamentos indefinidos.</p>



<p class="wp-block-paragraph">O uso de tipos padronizados do cabeçalho <code>&lt;stdint.h&gt;</code>, como <code>uint32_t</code>, <code>int64_t</code>, <code>uintptr_t</code> e <code>size_t</code> ajuda a manter a portabilidade. Em projetos Yocto, isso pode ser reforçado com flags de compilação como <code>-Wall -Werror -Wconversion</code> para forçar a detecção de discrepâncias.</p>



<h3 class="wp-block-heading">4. <strong>Stack e heap maiores, mas com armadilhas</strong></h3>



<p class="wp-block-paragraph">Com maior espaço de endereçamento, o tamanho padrão de <em>stack</em> e <em>heap</em> também aumenta, o que é útil para aplicações com recursividade profunda ou buffers temporários grandes. No entanto, isso pode mascarar erros de alocação ou vazamentos de memória, tornando o uso de ferramentas como Valgrind, AddressSanitizer ou <code>duma</code> ainda mais importante.</p>



<h2 class="wp-block-heading">Conclusão e Considerações Finais</h2>



<p class="wp-block-paragraph">A distinção entre sistemas operacionais de 32 e 64 bits vai muito além da simples capacidade de utilizar mais memória RAM. Ela abrange desde a estrutura interna dos processadores e do sistema operacional até o impacto direto na performance, compatibilidade de software e práticas de programação em linguagens como C e C++. Em ambientes de computação embarcada — como os baseados em SBCs tipo Raspberry Pi — essas diferenças influenciam não apenas o desempenho bruto, mas também a viabilidade de portar aplicações legadas e otimizar novos projetos.</p>



<p class="wp-block-paragraph">O uso do Linux como base, especialmente com o suporte modular e altamente configurável do Yocto Project, permite aos desenvolvedores construir distribuições personalizadas que exploram eficientemente as características da arquitetura escolhida. Com isso, é possível criar imagens de sistema que suportam binários de 64 bits com desempenho elevado, ao mesmo tempo em que mantêm compatibilidade com aplicações de 32 bits por meio de camadas multilib.</p>



<p class="wp-block-paragraph">Para programadores em C/C++, essa transição exige atenção cuidadosa à definição de tipos, alinhamento de dados e compatibilidade entre bibliotecas. Ao mesmo tempo, oferece oportunidades para otimizar algoritmos, explorar novos conjuntos de instruções e construir sistemas mais robustos e escaláveis.</p>



<p class="wp-block-paragraph">Portanto, a escolha entre 32 e 64 bits deve ser feita de forma consciente, considerando os requisitos da aplicação, os recursos do hardware e o ecossistema de software envolvido. Com as ferramentas e práticas corretas — especialmente no universo do Linux embarcado — é possível tirar proveito pleno das vantagens oferecidas pela arquitetura de 64 bits sem abrir mão da compatibilidade e eficiência.</p><p>The post <a href="https://mcu.tec.br/sistemas-operacionais/a-arquitetura-de-32-bits-vs-64-bits-em-sistemas-operacionais-linux/">A Arquitetura de 32 bits vs 64 bits em Sistemas Operacionais Linux</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">600</post-id>	</item>
		<item>
		<title>Como as Variáveis LANG e LC_ Influenciam o Bash: Um Guia para Sistemas Embarcados e SBCs*</title>
		<link>https://mcu.tec.br/sistemas-operacionais/como-as-variaveis-lang-e-lc_-influenciam-o-bash-um-guia-para-sistemas-embarcados-e-sbcs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-as-variaveis-lang-e-lc_-influenciam-o-bash-um-guia-para-sistemas-embarcados-e-sbcs</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Thu, 24 Jul 2025 21:54:48 +0000</pubDate>
				<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[automação em Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[casamento de padrões]]></category>
		<category><![CDATA[codificação regional]]></category>
		<category><![CDATA[globasciiranges]]></category>
		<category><![CDATA[globbing]]></category>
		<category><![CDATA[LANG]]></category>
		<category><![CDATA[LC_ALL]]></category>
		<category><![CDATA[LC_COLLATE]]></category>
		<category><![CDATA[LC_CTYPE]]></category>
		<category><![CDATA[locale]]></category>
		<category><![CDATA[localidade C]]></category>
		<category><![CDATA[ordenação de arquivos]]></category>
		<category><![CDATA[POSIX classes]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[regionalização em sistemas operacionais]]></category>
		<category><![CDATA[SBC]]></category>
		<category><![CDATA[scripts portáteis]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[variáveis de ambiente Linux]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=598</guid>

					<description><![CDATA[<p>Descubra como as variáveis de localidade LANG, LC_ALL, LC_COLLATE e LC_CTYPE influenciam o comportamento do Bash em sistemas GNU/Linux. Este guia detalhado mostra como essas variáveis afetam a ordenação de arquivos, casamento de padrões e codificação de caracteres — com foco especial em sistemas embarcados como o Raspberry Pi. Aprenda boas práticas para evitar falhas em scripts automatizados e garantir a consistência em ambientes minimalistas.</p>
<p>The post <a href="https://mcu.tec.br/sistemas-operacionais/como-as-variaveis-lang-e-lc_-influenciam-o-bash-um-guia-para-sistemas-embarcados-e-sbcs/">Como as Variáveis LANG e LC_ Influenciam o Bash: Um Guia para Sistemas Embarcados e SBCs*</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Introdução: Localidade, Shell e Sistemas Embarcados</h2>



<p class="wp-block-paragraph">Em sistemas GNU/Linux, especialmente em contextos embarcados como o Raspberry Pi, BeagleBone, ou outros SBCs (Single Board Computers), o comportamento de comandos e scripts pode variar drasticamente dependendo da configuração regional, ou <strong>localidade do sistema</strong>.</p>



<p class="wp-block-paragraph">Essas configurações são controladas por variáveis de ambiente como <code>LANG</code>, <code>LC_ALL</code>, <code>LC_COLLATE</code> e outras, que determinam como caracteres são interpretados, ordenados, e exibidos. Tais configurações afetam desde ordenações (<code>sort</code>, <code>ls</code>) até a forma como nomes de arquivos são casados por expressões regulares ou curingas (<code>globbing</code>). Isso é crítico, por exemplo, ao desenvolver scripts de automação para dispositivos embarcados que manipulam arquivos, logs, sensores ou comandos baseados em localização textual.</p>



<p class="wp-block-paragraph">Imagine que seu script precisa organizar arquivos por nome, processar logs em português ou lidar com valores numéricos usando <code>,</code> como separador decimal. Sem a localidade correta, isso pode falhar silenciosamente.</p>



<p class="wp-block-paragraph">No universo dos SBCs, que são muitas vezes utilizados em dispositivos de campo e IoT, o sistema operacional pode ser simplificado e conter configurações de localidade mínimas. Nestes casos, a manipulação correta dessas variáveis se torna ainda mais crucial para garantir previsibilidade e portabilidade de comportamento, tanto no shell interativo quanto em scripts automatizados.</p>



<p class="wp-block-paragraph">Nas próximas seções, exploraremos essas variáveis, como elas afetam os comandos no Bash e como manipulá-las — com atenção especial ao contexto embarcado.</p>



<h2 class="wp-block-heading">Comando <code>locale</code> e a Visão Geral das Variáveis Regionais</h2>



<p class="wp-block-paragraph">Em sistemas GNU/Linux, o comando <code>locale</code> permite inspecionar as variáveis de ambiente relacionadas à localização. A saída desse comando mostra como o sistema interpretará aspectos culturais como idioma, ordenação de caracteres, separadores decimais, formato de data, entre outros.</p>



<p class="wp-block-paragraph">Por exemplo, em uma distribuição Debian (como o Raspberry Pi OS), o comando <code>locale</code> pode retornar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;code&gt;$ locale
LANG=pt_BR.UTF-8
LANGUAGE=pt_BR:pt:en
LC_CTYPE=&quot;pt_BR.UTF-8&quot;
LC_NUMERIC=&quot;pt_BR.UTF-8&quot;
LC_TIME=&quot;pt_BR.UTF-8&quot;
LC_COLLATE=&quot;pt_BR.UTF-8&quot;
LC_MONETARY=&quot;pt_BR.UTF-8&quot;
LC_MESSAGES=&quot;pt_BR.UTF-8&quot;
LC_PAPER=&quot;pt_BR.UTF-8&quot;
LC_NAME=&quot;pt_BR.UTF-8&quot;
LC_ADDRESS=&quot;pt_BR.UTF-8&quot;
LC_TELEPHONE=&quot;pt_BR.UTF-8&quot;
LC_MEASUREMENT=&quot;pt_BR.UTF-8&quot;
LC_IDENTIFICATION=&quot;pt_BR.UTF-8&quot;
LC_ALL=" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">&lt;code&gt;</span><span style="color: #D8DEE9FF">$ locale</span></span>
<span class="line"><span style="color: #D8DEE9FF">LANG=pt_BR.UTF-8</span></span>
<span class="line"><span style="color: #D8DEE9FF">LANGUAGE=pt_BR:pt:en</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_CTYPE=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_NUMERIC=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_TIME=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_COLLATE=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_MONETARY=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_MESSAGES=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_PAPER=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_NAME=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_ADDRESS=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_TELEPHONE=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_MEASUREMENT=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_IDENTIFICATION=&quot;pt_BR.UTF-8&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">LC_ALL=</span></span></code></pre></div>



<h3 class="wp-block-heading">Entendendo os Valores com e sem Aspas</h3>



<p class="wp-block-paragraph">Alguns valores são exibidos com aspas, como <code>LC_COLLATE="pt_BR.UTF-8"</code>, enquanto outros aparecem sem aspas, como <code>LANG=pt_BR.UTF-8</code>. O que isso significa?</p>



<ul class="wp-block-list">
<li>Os <strong>valores sem aspas</strong> indicam que a variável está explicitamente definida no ambiente.</li>



<li>Os <strong>valores entre aspas</strong> são inferidos pelo utilitário <code>locale</code> com base nas variáveis <code>LANG</code>, <code>LANGUAGE</code> ou <code>LC_ALL</code>.</li>
</ul>



<p class="wp-block-paragraph">Esse comportamento é especialmente importante em sistemas embarcados minimalistas, nos quais pode haver apenas uma ou duas variáveis definidas no <code>/etc/environment</code> ou em arquivos de inicialização (<code>/etc/profile</code>, <code>~/.bashrc</code>, etc). Scripts que dependem de ordenações específicas ou de codificações UTF-8 podem se comportar de forma errática se essas inferências não forem corretas.</p>



<h3 class="wp-block-heading">Verificação com Expansão de Parâmetros</h3>



<p class="wp-block-paragraph">Podemos confirmar quais variáveis estão definidas usando a expansão de parâmetros do Bash:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$ echo ${LANG:-indefinida}
pt_BR.UTF-8

$ echo 
${LC_CTYPE:-indefinida}
indefinida" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF">LANG</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">indefinida</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9">pt_BR</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">UTF</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">8</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF">LC_CTYPE</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">indefinida</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9">indefinida</span></span></code></pre></div>



<p class="wp-block-paragraph">Isso mostra que <code>LANG</code> está definida diretamente, enquanto <code>LC_CTYPE</code> está apenas herdando seu valor indiretamente. Isso pode ser problemático se um script ou biblioteca exigir uma definição explícita de <code>LC_*</code>.</p>



<p class="wp-block-paragraph">No caso de SBCs configurados para ambientes headless ou sem interface gráfica, é comum encontrar apenas <code>LANG=C</code> ou <code>LANG=en_US.UTF-8</code>, o que pode resultar em mensagens de erro em inglês, formatos de número com ponto ao invés de vírgula, e problemas de casamento de padrões.</p>



<h2 class="wp-block-heading">Variáveis <code>LANG</code>, <code>LC_ALL</code>, <code>LC_COLLATE</code> e <code>LC_CTYPE</code> e seu Impacto em Padrões de Arquivo</h2>



<p class="wp-block-paragraph">No Bash, o casamento de padrões — também conhecido como <em>globbing</em> — permite que expressões como <code>*.txt</code> ou <code>[a-z]*</code> sejam expandidas automaticamente para os nomes de arquivos correspondentes no diretório. Porém, o comportamento dessas expressões pode variar drasticamente dependendo das variáveis de localidade configuradas no sistema.</p>



<p class="wp-block-paragraph">Essas variáveis influenciam não apenas a forma como os caracteres são agrupados e ordenados, mas também como são reconhecidos acentos, maiúsculas e minúsculas, ou caracteres especiais.</p>



<h3 class="wp-block-heading">As Principais Variáveis</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Variável</th><th>Função</th></tr></thead><tbody><tr><td><code>LANG</code></td><td>Valor global padrão para todas as categorias de localidade não especificadas individualmente.</td></tr><tr><td><code>LC_ALL</code></td><td>Prioridade máxima: sobrescreve todas as outras variáveis <code>LC_*</code> e <code>LANG</code>.</td></tr><tr><td><code>LC_COLLATE</code></td><td>Define a ordem de classificação e agrupamento dos caracteres (crítico para o <em>globbing</em> e expressões de faixa como <code>[A-Z]</code>).</td></tr><tr><td><code>LC_CTYPE</code></td><td>Determina a interpretação de caracteres (quais são válidos, classes de caracteres, como <code>[:alpha:]</code>).</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Casos Reais em Sistemas Embarcados</h3>



<p class="wp-block-paragraph">Imagine um script de atualização automática rodando em um Raspberry Pi em campo, cujo objetivo é deletar arquivos antigos com nomes que começam com letra minúscula. Um comando como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="rm [a-z]*.log
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">rm</span><span style="color: #D8DEE9FF"> [</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">z</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">*</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">log</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Pode funcionar corretamente em um terminal, mas falhar em um script se <code>LC_COLLATE</code> estiver indefinida ou mal configurada. Em alguns ambientes, essa expressão incluirá também arquivos que começam com letras maiúsculas, por conta da ordenação &#8220;intercalada&#8221; do UTF-8 padrão brasileiro (aAbBcC&#8230;).</p>



<p class="wp-block-paragraph">Outro exemplo: se você estiver coletando dados de sensores e salvando arquivos com nomes baseados em data (<code>01-água.csv</code>, <code>02-óleo.csv</code>), a forma como acentos são tratados depende de <code>LC_CTYPE</code>. Uma falha de codificação pode impedir a abertura correta desses arquivos em um script automatizado, especialmente se a localidade estiver como <code>C</code> ou <code>POSIX</code> (ASCII puro).</p>



<h3 class="wp-block-heading">Como Definir e Testar</h3>



<p class="wp-block-paragraph">Você pode modificar essas variáveis temporariamente na sessão atual:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="LC_COLLATE=C
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">LC_COLLATE</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">C</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Ou exportá-las globalmente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="export LC_COLLATE=C
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">LC_COLLATE</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">C</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">E testá-las de forma isolada para entender seus efeitos:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="echo ${LC_COLLATE:-&quot;não definida&quot;}
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF">LC_COLLATE</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">-</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">não definida</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Boas Práticas para SBCs</h3>



<ul class="wp-block-list">
<li>Defina <code>LC_ALL</code> como <code>C</code> ou <code>en_US.UTF-8</code> para garantir comportamento consistente.</li>



<li>Use <code>LC_COLLATE=C</code> quando scripts dependerem de ordenações previsíveis.</li>



<li>Inclua exportações explícitas nos seus scripts <code>sh</code> ou <code>bash</code> para garantir que se comportem da mesma forma em qualquer dispositivo.</li>
</ul>



<h2 class="wp-block-heading">A Localidade Especial <code>C</code> e o Controle Preciso do Comportamento do Bash</h2>



<p class="wp-block-paragraph">No universo das variáveis de localização, existe uma localidade especial chamada <code>C</code>. Diferentemente de <code>pt_BR.UTF-8</code> ou <code>en_US.UTF-8</code>, a localidade <code>C</code> representa o comportamento mais básico e previsível possível, sendo praticamente universal no mundo da computação. Ela é essencial quando se busca confiabilidade em scripts shell, especialmente em sistemas embarcados com poucos recursos ou configurações regionais mínimas.</p>



<h3 class="wp-block-heading">Características da Localidade <code>C</code></h3>



<ul class="wp-block-list">
<li>Usa codificação ASCII simples, de 1 byte por caractere.</li>



<li>A ordenação de caracteres é feita com base direta nos valores binários (<em>byte values</em>).</li>



<li>O agrupamento de faixas de caracteres (<code>[a-z]</code>) segue estritamente a sequência da tabela ASCII: <code>A-Z</code> (65–90) vem antes de <code>a-z</code> (97–122).</li>
</ul>



<p class="wp-block-paragraph">Essa previsibilidade é justamente o que torna <code>LC_COLLATE=C</code> tão poderosa: ela ignora regras culturais ou linguísticas e fornece uma base estável para o comportamento do shell.</p>



<h3 class="wp-block-heading">Exemplo Prático em SBCs</h3>



<p class="wp-block-paragraph">Em um Raspberry Pi com sistema configurado para <code>pt_BR.UTF-8</code>, é comum ver listagens como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$ ls
a.txt  A.txt  b.txt  B.txt  á.txt  é.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ls</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">á</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">é</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Na configuração padrão com <code>LANG=pt_BR.UTF-8</code>, ao executar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$ for f in *; do echo $f; done
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$f</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">done</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">A saída pode parecer confusa — intercalando maiúsculas, minúsculas e acentuados — por conta do ordenamento baseado em regras linguísticas.</p>



<p class="wp-block-paragraph">Ao mudar a localidade:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$ LC_COLLATE=C
$ for f in *; do echo $f; done
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">LC_COLLATE</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">C</span></span>
<span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$f</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">done</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">A ordenação se torna:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="A.txt
B.txt
a.txt
b.txt
á.txt
é.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">á</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">é</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essa separação limpa entre letras maiúsculas e minúsculas é extremamente útil ao criar scripts que processam arquivos em ordem, organizam logs, ou iteram sobre faixas de caracteres com <code>for</code>.</p>



<h3 class="wp-block-heading">Comportamento com <code>globasciiranges</code></h3>



<p class="wp-block-paragraph">O Bash possui uma opção interna chamada <code>globasciiranges</code> que, quando ativada, força o uso da localidade <code>C</code> <strong>apenas</strong> para faixas como <code>[a-z]</code> ou <code>[A-Z]</code>, independentemente da localidade real do sistema.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="$ shopt -u globasciiranges
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">$</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">shopt</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">u</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">globasciiranges</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Com ela desabilitada, <code>[a-z]</code> pode capturar <strong>tanto letras minúsculas quanto maiúsculas</strong>, conforme a regra cultural da localidade. Isso pode quebrar scripts que assumem que <code>[a-z]</code> só contém minúsculas. Ao configurar <code>LC_COLLATE=C</code>, garantimos que <code>[a-z]</code> funcione conforme esperado, inclusive em SBCs com localidade exótica.</p>



<h2 class="wp-block-heading">Classes POSIX para Casamento de Padrões Confiáveis</h2>



<p class="wp-block-paragraph">Nos sistemas GNU/Linux, além do uso de faixas explícitas como <code>[a-z]</code> ou <code>[A-Z]</code>, também é possível empregar <strong>classes POSIX de caracteres</strong> dentro de colchetes, o que oferece maior precisão e independência das localizações regionais. Isso é extremamente útil em sistemas embarcados, onde o suporte a codificações e regras de ordenação pode ser limitado ou inconsistente.</p>



<p class="wp-block-paragraph">As classes POSIX são representadas por <code>[:nome:]</code>, e devem ser utilizadas dentro de colchetes duplos, como <code>[[:lower:]]</code> ou <code>[[:digit:]]</code>. Diferente de faixas como <code>[a-z]</code>, que podem se comportar de maneira diferente dependendo de <code>LC_COLLATE</code>, as classes POSIX sempre respeitam a definição de tipo de caractere, e não a posição em uma tabela.</p>



<h3 class="wp-block-heading">Exemplos Comuns de Classes POSIX</h3>



<ul class="wp-block-list">
<li><code>[[:lower:]]</code> — todos os caracteres minúsculos (incluindo acentuados como <code>á</code>, <code>ç</code> etc).</li>



<li><code>[[:upper:]]</code> — todos os caracteres maiúsculos.</li>



<li><code>[[:digit:]]</code> — dígitos de 0 a 9.</li>



<li><code>[[:alpha:]]</code> — qualquer letra (maiúscula ou minúscula).</li>



<li><code>[[:alnum:]]</code> — letras e números.</li>
</ul>



<h3 class="wp-block-heading">Comparação Prática em SBCs</h3>



<p class="wp-block-paragraph">Suponha que você tenha os seguintes arquivos em um Raspberry Pi:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="a.txt  A.txt  á.txt  b.txt  B.txt  é.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">á</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">é</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Se tentar listar apenas os arquivos que começam com letra maiúscula com:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ls [A-Z]*
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">ls</span><span style="color: #D8DEE9FF"> [</span><span style="color: #D8DEE9">A</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">Z</span><span style="color: #D8DEE9FF">]</span><span style="color: #81A1C1">*</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Você pode receber resultados inesperados, dependendo de <code>LC_COLLATE</code>. Porém, se usar:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ls [[:upper:]]*
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">ls</span><span style="color: #D8DEE9FF"> [[:</span><span style="color: #D8DEE9">upper</span><span style="color: #D8DEE9FF">:]]</span><span style="color: #81A1C1">*</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">A listagem será precisa: apenas arquivos cujo primeiro caractere é <strong>de fato</strong> uma letra maiúscula, independentemente da localidade ou da codificação:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="A.txt  B.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O mesmo vale para:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ls [[:lower:]]*
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">ls</span><span style="color: #D8DEE9FF"> [[:</span><span style="color: #D8DEE9">lower</span><span style="color: #D8DEE9FF">:]]</span><span style="color: #81A1C1">*</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Retornando corretamente:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="a.txt  á.txt  b.txt  é.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">á</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">é</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Ou seja, as classes POSIX são ideais para scripts portáteis, confiáveis e independentes de configurações regionais — exatamente o tipo de robustez que se espera em automações para sistemas embarcados, onde ambientes podem ser reconfigurados, simplificados ou até reconstruídos entre reboots.</p>



<h2 class="wp-block-heading">Expansões que Não São Afetadas por <code>LC_*</code>: Cuidado com Intervalos <code>{A..Z}</code></h2>



<p class="wp-block-paragraph">Embora <code>LC_COLLATE</code> e <code>LC_CTYPE</code> tenham papel fundamental no comportamento do Bash em relação a <em>globbing</em> (casamento de padrões como <code>[a-z]*</code>), elas <strong>não</strong> afetam todas as formas de expansão. Um exemplo clássico são as <strong>expansões de intervalos com chaves</strong>, como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="for f in {A..Z}; do echo &quot;$f.txt&quot;; done
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF">A..</span><span style="color: #D8DEE9">Z</span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">$f.txt</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">done</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse tipo de construção é gerado <strong>antes</strong> da expansão de variáveis e não passa pelas mesmas regras de collation. Ou seja, é <strong>estritamente baseado na ordem da tabela ASCII</strong>, independentemente de qualquer variável de localidade.</p>



<h3 class="wp-block-heading">Exemplo Prático</h3>



<p class="wp-block-paragraph">Considere o seguinte diretório:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="a.txt  A.txt  b.txt  B.txt  c.txt  C.txt  d.txt  D.txt  e.txt  E.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">c</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">C</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">D</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">E</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Se você usar uma expansão com chaves:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="for f in {a..e}; do echo &quot;$f.txt&quot;; done
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF">a..</span><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">do</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">$f.txt</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">done</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O resultado será:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="a.txt
b.txt
c.txt
d.txt
e.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">c</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">E com <code>{A..E}</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="A.txt
B.txt
C.txt
D.txt
E.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">C</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">D</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"><span style="color: #D8DEE9">E</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Agora compare com:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="ls [a-e].txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">ls</span><span style="color: #D8DEE9FF"> [</span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">e</span><span style="color: #D8DEE9FF">]</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse comando é sensível a <code>LC_COLLATE</code>. Com a localidade brasileira padrão (<code>pt_BR.UTF-8</code>), o resultado pode incluir <strong>maiúsculas e minúsculas intercaladas</strong>, como:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="a.txt  A.txt  b.txt  B.txt  c.txt  C.txt  d.txt  D.txt  e.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">A</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">B</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">c</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">C</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">D</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Com <code>LC_COLLATE=C</code>, o resultado muda para incluir apenas os que realmente começam com letras entre <code>a</code> e <code>e</code>, em ASCII puro:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="a.txt  b.txt  c.txt  d.txt  e.txt
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">c</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">e</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">txt</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">Implicações em Scripts Embarcados</h3>



<p class="wp-block-paragraph">É fundamental compreender que:</p>



<ul class="wp-block-list">
<li><strong>Expansões com chaves (<code>{}</code>)</strong> são determinísticas e previsíveis.</li>



<li><strong>Casamento de padrões (<code>[]</code>)</strong> depende da localidade e das opções do shell.</li>
</ul>



<p class="wp-block-paragraph">Se você estiver escrevendo scripts para rodar em dispositivos como Raspberry Pi ou sistemas minimalistas baseados em BusyBox (muito comuns em ambientes embarcados), priorizar construções com <code>{}</code> pode evitar surpresas. No entanto, se a lógica depender de padrões dinâmicos com curingas, então a configuração de <code>LC_COLLATE</code> deve ser controlada explicitamente no início do script para garantir consistência.</p>



<h3 class="wp-block-heading">Conclusão</h3>



<p class="wp-block-paragraph">Na maioria das vezes, a opção <code>globasciiranges</code> está habilitada por padrão e a localidade é definida de forma coerente. Mas, em casos onde comportamento anômalo surge — como scripts que listam arquivos de forma incorreta ou processam nomes inesperadamente —, agora você sabe exatamente onde e como atuar.</p>



<p class="wp-block-paragraph">Esse conhecimento é especialmente valioso em sistemas embarcados, onde o ambiente é frequentemente construído com otimizações e simplificações que podem omitir variáveis fundamentais.</p><p>The post <a href="https://mcu.tec.br/sistemas-operacionais/como-as-variaveis-lang-e-lc_-influenciam-o-bash-um-guia-para-sistemas-embarcados-e-sbcs/">Como as Variáveis LANG e LC_ Influenciam o Bash: Um Guia para Sistemas Embarcados e SBCs*</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">598</post-id>	</item>
	</channel>
</rss>
