O til em seu PATH pode não ser sua HOME
Usar `~` em comandos de shell — especialmente ao modificar o `PATH` — pode se comportar de forma muito diferente do que muitos usuários esperam, porque a expansão de til só ocorre em posições específicas sem aspas e varia entre shells POSIX e extensões de Bash/Zsh. Comentários compartilham armadilhas como inserir acidentalmente um `~` literal no `PATH` ou até apagar `$HOME`, debatem se diretórios locais do usuário devem preceder caminhos do sistema e contrastam as várias “armadilhas” do Bash com shells alternativos como fish, nushell e zsh. A discussão destaca como regras sutis de aspas e expansão, além de ferramentas e documentação inconsistentes, tornam o uso e a escrita de scripts em shell robustos mais difícil do que parece.
Expansão de til e comportamento do PATH
- O til só se expande em posições específicas (no início de uma “palavra” sem aspas; em alguns shells também após dois-pontos sem aspas em atribuições).
- Colocar aspas em
~impede a expansão e pode deixar um~literal no PATH, que é o problema original. - Alguns shells (zsh, fish) oferecem maneiras mais convenientes ou baseadas em arrays para adicionar
~/.local/binao PATH, lidando corretamente com a expansão. - Vários comentaristas preferem usar
$HOMEem vez de~em scripts para evitar surpresas.
Regras de aspas e armadilhas comuns de shell
- Entender mal quando usar aspas é uma grande fonte de bugs: as pessoas tanto colocam aspas demais quanto de menos.
- Orientação oferecida:
- Sempre coloque aspas em expansões de variáveis (
"$var") em argumentos para evitar divisão por palavras e globbing. - Use aspas simples apenas para strings literais que contenham caracteres especiais.
- Sempre coloque aspas em expansões de variáveis (
- Expansão de variáveis e expansão de til se comportam de forma diferente; tratá-las como iguais leva a erros.
Ordenação e segurança do PATH
- Debate sobre se deve-se colocar no início ou no fim diretórios do usuário como
~/.local/bin.- Um lado: adicionar ao fim para que binários do sistema tenham precedência, reduzindo o risco de substituições maliciosas.
- Outro lado: adicionar ao início para que os usuários possam substituir intencionalmente ferramentas do sistema desatualizadas.
- Consenso de que, se um invasor consegue gravar nos diretórios do seu PATH, você já está em um comprometimento sério.
POSIX vs comportamento específico do shell
- Alguns comportamentos no artigo dependem de extensões do bash/zsh e não são portáveis para
/bin/sh(frequentementedashouash). - Regras de expansão de til do POSIX foram citadas; houve confusão inicial, depois esclarecimento de que a expansão após
:sem aspas em atribuições é permitida. - Vários lembretes para distinguir “bashisms” de construções estritamente compatíveis com POSIX.
Shells alternativos e escolhas de linguagem
- Muitos criticam o bash como uma linguagem de script “terrível” ou frágil, com muitos casos-limite.
- Alternativas mencionadas: fish, zsh, nushell, murex, PowerShell, Perl, Ruby, etc.
- Contraponto: bash/sh continuam dominantes porque já vêm instalados em todo lugar, especialmente em sistemas remotos.
Nomes de arquivos, caracteres e robustez
- Alguns argumentam que a vida seria mais fácil se os caminhos só permitissem um conjunto ASCII restrito, para evitar problemas de codificação e parsing.
- Outros defendem fortemente suporte a scripts não latinos e Unicode arbitrário, apesar das dores de cabeça nas ferramentas.
- Usar espaços ou
-no início em nomes de arquivos é apontado como uma fonte frequente de bugs e armadilhas de segurança.
Ambiente, HOME e depuração
- Foi observada a distinção entre
$HOMEe a home da conta nas bases de dados do sistema; eles podem divergir e confundir a resolução de~. - Manipular HOME para testes pode entrar em conflito com ferramentas que resolvem diretórios pessoais de maneiras diferentes.
- Grandes organizações costumam ter arquivos de inicialização do shell profundamente em camadas, dificultando rastrear onde as variáveis são definidas; ferramentas de tracing para inicialização do shell foram recomendadas.
Histórias de guerra e lições
- Várias anedotas: criar um diretório literal
~, executarrm -r ~por engano e ferramentas de IA criando diretórios~. - Lições extraídas: evite
rm -rquando possível, use caminhos mais explícitos (./~) e trate recursos de shell com cautela.