Um shell moderno, seguro e extensível escrito em Rust
Instalação • Uso • Comandos • Recursos • Configuração • Desenvolvimento
- Sobre
- Características
- Instalação
- Uso
- Comandos
- Recursos
- Configuração
- Arquitetura
- Desenvolvimento
- FAQ
- Troubleshooting
- Roadmap
- Licença
- Créditos
Aensh (Aency Shell) é um shell de linha de comando moderno escrito em Rust, projetado para ser:
- 🔒 Seguro: Memory-safe por design, sem buffer overflows ou use-after-free
- ⚡ Rápido: Compilado para código nativo, sem overhead de interpretação
- 🎨 Bonito: Interface colorida e moderna com prompts customizáveis
- 🔧 Extensível: Sistema de aliases e plugins para customização
- 📚 Educativo: Código limpo e bem documentado para aprendizado
O Aensh foi criado como uma alternativa moderna aos shells tradicionais (bash, zsh, fish), combinando o melhor de cada um com as garantias de segurança do Rust.
| Feature | Descrição |
|---|---|
| Navegação Inteligente | Use setas ↑↓ para histórico e ←→ para mover o cursor |
| Piping Completo | Encadeie comandos com | e && |
| Aliases | Defina atalhos para comandos frequentes |
| Histórico Persistente | Histórico salvo entre sessões |
| Comandos Externos | Execute qualquer comando do sistema |
| Setup Interativo | Configuração guiada na primeira execução |
| Prompt Customizável | Mostra usuário, host e diretório atual |
O Aensh inclui 30+ comandos built-in implementados em Rust puro:
| Categoria | Comandos |
|---|---|
| Shell | help, exit, quit, alias, reload, source, plugin |
| Navegação | cd, pwd |
| Filesystem | ls, cat, mkdir, touch, rm, cp, mv, find, grep, tree, head, tail, wc |
| Sistema | echo, clear, info, whoami, date, stat, env, export, unset, history, which, type |
| Sistema | Status |
|---|---|
| Linux (Ubuntu, Debian, Fedora, Arch) | ✅ Suportado |
| macOS | ✅ Suportado |
| WSL (Windows Subsystem for Linux) | ✅ Suportado |
| Windows (nativo) | ❌ Não suportado |
A forma mais fácil de instalar o Aensh é usando o script de instalação:
curl -sSL https://raw.githubusercontent.com/aencyorganization/aensh/main/install.sh | bashEste script irá:
- Verificar se Rust está instalado (instala se necessário)
- Clonar o repositório
- Compilar o Aensh em modo release
- Instalar em
~/.local/bin/ - Adicionar ao PATH
- Criar diretórios de configuração
Se preferir instalar manualmente:
# 1. Clone o repositório
git clone https://github.com/aencyorganization/aensh.git
cd aensh
# 2. Compile em modo release
cargo build --release
# 3. Copie o binário para um diretório no PATH
cp target/release/aensh ~/.local/bin/
# 4. Certifique-se que ~/.local/bin está no PATH
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc- Rust 1.70+ - Instale via rustup
- Cargo - Vem junto com Rust
- Git - Para clonar o repositório
# Instalar Rust (se necessário)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# Verificar instalação
rustc --version
cargo --version
# Clonar e compilar
git clone https://github.com/aencyorganization/aensh.git
cd aensh
cargo build --release
# O binário estará em target/release/aensh
./target/release/aensh --version# Verificar versão
aensh --version
# Verificar informações do sistema
aensh --info
# Iniciar o shell
aensh# Iniciar normalmente
aensh
# Executar um comando e sair
aensh -c "ls -la"
# Ver ajuda
aensh --help| Opção | Descrição |
|---|---|
-h, --help |
Mostra mensagem de ajuda |
-v, --version |
Mostra versão do Aensh |
--setup |
Re-executa o setup inicial |
--info |
Mostra informações do sistema |
--config |
Mostra configuração atual |
--default true |
Define Aensh como shell padrão |
--default false |
Remove Aensh como shell padrão |
--system-default true |
Modo integração forte (usa chsh quando permitido) |
--system-default false |
Remove integração forte e tenta restaurar shell anterior |
-c <cmd> |
Executa comando e sai |
Na primeira execução, o Aensh apresenta um setup interativo:
╔══════════════════════════════════════════════════════════════╗
║ 🦀 Bem-vindo ao Aensh! 🦀 ║
║ ║
║ Vamos configurar seu shell em alguns passos rápidos. ║
╚══════════════════════════════════════════════════════════════╝
Passo 1: Qual shell você estava usando antes?
[1] Bash
[2] Zsh
[3] Fish
Escolha (1-3):
O setup pergunta:
- Shell anterior: Bash, Zsh ou Fish
- Shell padrão: Se deseja que o Aensh inicie automaticamente
Integração forte (opcional): Por padrão,
--default trueapenas adiciona um bloco no arquivo RC do seu shell anterior. Para tentar também mudar o login shell viachsh, use:aensh --system-default trueIsso só terá efeito se o caminho do shell estiver listado em
/etc/shells. Para desfazer:aensh --system-default false
Para fazer o Aensh iniciar automaticamente quando você abre o terminal:
# Ativar
aensh --default true
# Desativar
aensh --default falseIsso adiciona/remove um script no arquivo RC do seu shell anterior (.bashrc, .zshrc ou config.fish).
Mostra a lista de comandos disponíveis.
aensh> helpEncerra o shell.
aensh> exit
# ou
aensh> quitGerencia aliases de comandos.
# Listar todos os aliases
aensh> alias
# Ver um alias específico
aensh> alias ll
# Definir um alias
aensh> alias ll='ls -la'
# Adicionar alias
aensh> alias add gs git status
# Remover alias
aensh> alias remove ll
# Recarregar aliases do arquivo
aensh> alias reloadRecarrega o arquivo de configuração ~/.aenshrc.
aensh> reload
# ou
aensh> sourceGerencia plugins externos.
# Listar plugins
aensh> plugin list
# Adicionar plugin
aensh> plugin add nome /caminho/script "Descrição"
# Remover plugin
aensh> plugin remove nome
# Ajuda
aensh> plugin helpAltera o diretório atual.
# Ir para um diretório
aensh> cd /home/user/Documents
# Ir para home
aensh> cd ~
aensh> cd
# Voltar um nível
aensh> cd ..
# Voltar dois níveis
aensh> cd ../..Mostra o diretório atual.
aensh> pwd
/home/user/DocumentsLista arquivos e diretórios.
# Listar diretório atual
aensh> ls
# Listar diretório específico
aensh> ls /home/user
# Listar com detalhes (via alias)
aensh> llExibe o conteúdo de arquivos.
# Ver conteúdo de um arquivo
aensh> cat arquivo.txt
# Ver múltiplos arquivos
aensh> cat arquivo1.txt arquivo2.txtCria um novo diretório.
# Criar diretório
aensh> mkdir novo_diretorio
# Criar diretórios aninhados
aensh> mkdir -p pasta/subpasta/outraCria um arquivo vazio ou atualiza timestamp.
# Criar arquivo
aensh> touch novo_arquivo.txt
# Criar múltiplos arquivos
aensh> touch arquivo1.txt arquivo2.txtRemove arquivos ou diretórios.
# Remover arquivo
aensh> rm arquivo.txt
# Remover diretório (recursivo)
aensh> rm -r diretorio/
# Forçar remoção
aensh> rm -f arquivo.txtCopia arquivos ou diretórios.
# Copiar arquivo
aensh> cp origem.txt destino.txt
# Copiar diretório
aensh> cp -r pasta/ nova_pasta/Move ou renomeia arquivos.
# Mover arquivo
aensh> mv arquivo.txt /outro/lugar/
# Renomear arquivo
aensh> mv antigo.txt novo.txtBusca arquivos em diretórios.
# Buscar por nome
aensh> find *.txt
# Buscar em diretório específico
aensh> find /home/user documentoBusca padrões em arquivos.
# Buscar texto em arquivo
aensh> grep "padrão" arquivo.txt
# Buscar em múltiplos arquivos
aensh> grep "texto" *.txtMostra estrutura de diretórios em árvore.
# Árvore do diretório atual
aensh> tree
# Árvore de diretório específico
aensh> tree /home/user/projetoMostra as primeiras linhas de um arquivo.
# Primeiras 10 linhas (padrão)
aensh> head arquivo.txt
# Primeiras N linhas
aensh> head -n 20 arquivo.txtMostra as últimas linhas de um arquivo.
# Últimas 10 linhas (padrão)
aensh> tail arquivo.txt
# Últimas N linhas
aensh> tail -n 20 arquivo.txtConta linhas, palavras e caracteres.
# Contagem completa
aensh> wc arquivo.txt
# Apenas linhas
aensh> wc -l arquivo.txt
# Apenas palavras
aensh> wc -w arquivo.txt
# Apenas caracteres
aensh> wc -c arquivo.txtExibe texto na tela.
# Texto simples
aensh> echo Hello World
# Com variáveis de ambiente
aensh> echo $HOMELimpa a tela do terminal.
aensh> clearMostra informações do Aensh.
aensh> infoMostra o usuário atual.
aensh> whoami
gabrielMostra a data e hora atual.
aensh> date
Tue Dec 3 14:30:00 -03 2024Mostra informações de arquivo/diretório.
aensh> stat arquivo.txtMostra variáveis de ambiente.
# Listar todas
aensh> env
# Ver variável específica
aensh> env HOMEDefine variável de ambiente.
# Definir variável
aensh> export MINHA_VAR=valor
# Verificar
aensh> env MINHA_VARRemove variável de ambiente.
aensh> unset MINHA_VARMostra histórico de comandos.
# Ver todo histórico
aensh> history
# Ver últimos N comandos
aensh> history 20Mostra caminho de um comando.
aensh> which python
/usr/bin/python
aensh> which ls
ls: aensh builtinMostra tipo de um comando.
aensh> type ls
ls is a aensh builtin command
aensh> type python
python is /usr/bin/pythonO Aensh suporta navegação completa na linha de comando:
| Tecla | Ação |
|---|---|
↑ |
Comando anterior no histórico |
↓ |
Próximo comando no histórico |
← |
Move cursor para esquerda |
→ |
Move cursor para direita |
Home |
Vai para início da linha |
End |
Vai para fim da linha |
Ctrl+A |
Vai para início da linha |
Ctrl+E |
Vai para fim da linha |
Ctrl+U |
Limpa a linha |
Ctrl+W |
Apaga palavra anterior |
Ctrl+C |
Cancela comando atual |
Ctrl+D |
Sai do shell (EOF) |
Backspace |
Apaga caractere anterior |
Delete |
Apaga caractere atual |
O histórico é salvo automaticamente em ~/.aensh_history:
# Ver histórico
aensh> history
# Ver últimos 20 comandos
aensh> history 20Características:
- Persistente entre sessões
- Máximo de 1000 entradas
- Não duplica comandos consecutivos
- Navegável com setas ↑↓
Redireciona a saída de um comando para a entrada de outro:
# Listar e filtrar
aensh> ls | grep txt
# Contar arquivos
aensh> ls | wc -l
# Encadear múltiplos
aensh> cat arquivo.txt | grep erro | wc -lExecuta comandos em sequência (para se um falhar):
# Criar e entrar em diretório
aensh> mkdir projeto && cd projeto
# Compilar e executar
aensh> cargo build && cargo run
# Múltiplos comandos
aensh> git add . && git commit -m "update" && git pushAliases são atalhos para comandos frequentes.
# Via comando
aensh> alias ll='ls -la'
aensh> alias gs='git status'
# Via arquivo ~/.aenshrc
alias ll='ls -la'
alias la='ls -a'
alias ..='cd ..'O arquivo ~/.aenshrc é carregado automaticamente:
# ~/.aenshrc
# Navegação
alias ll='ls -la'
alias la='ls -a'
alias l='ls'
alias ..='cd ..'
alias ...='cd ../..'
# Git
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -10'
# Atalhos
alias cls='clear'
alias home='cd ~'O Aensh pode executar qualquer comando do sistema que não seja um built-in:
# Ferramentas de desenvolvimento
aensh> python script.py
aensh> node app.js
aensh> cargo build
aensh> npm install
# Utilitários
aensh> curl https://api.example.com
aensh> wget https://example.com/file.zip
aensh> git clone https://github.com/user/repo
# Editores
aensh> vim arquivo.txt
aensh> nano arquivo.txt
aensh> code .
# Programas interativos
aensh> htop
aensh> cmatrix
aensh> vimPlugins são scripts executáveis que estendem o Aensh.
- Crie um script em
~/.config/aensh/plugins/:
#!/bin/bash
# ~/.config/aensh/plugins/hello
echo "Hello from plugin!"
echo "Arguments: $@"- Torne executável:
chmod +x ~/.config/aensh/plugins/hello- Use no Aensh:
aensh> hello world
Hello from plugin!
Arguments: world# Listar plugins
aensh> plugin list
# Adicionar plugin manualmente
aensh> plugin add myscript /path/to/script "Descrição"
# Remover plugin
aensh> plugin remove myscript| Arquivo | Descrição |
|---|---|
~/.aenshrc |
Aliases e configurações do usuário |
~/.config/aensh/config.json |
Configuração do Aensh |
~/.config/aensh/plugins/ |
Diretório de plugins |
~/.config/aensh/plugins.json |
Registro de plugins |
~/.aensh_history |
Histórico de comandos |
Arquivo de configuração do usuário, carregado na inicialização:
# ~/.aenshrc
# Aensh Configuration File
# Aliases de navegação
alias ll='ls -la'
alias la='ls -a'
alias l='ls'
alias ..='cd ..'
alias ...='cd ../..'
alias cls='clear'
# Aliases de Git
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -10'
alias gd='git diff'
# Aliases de navegação rápida
alias home='cd ~'
alias docs='cd ~/Documents'
alias dl='cd ~/Downloads'
alias proj='cd ~/Projects'
# Aliases de desenvolvimento
alias py='python3'
alias pip='pip3'
alias nr='npm run'
alias dc='docker-compose'Configuração interna do Aensh:
{
"default_shell": true,
"previous_shell": "Fish",
"setup_completed": true
}| Campo | Tipo | Descrição |
|---|---|---|
default_shell |
boolean | Se Aensh é o shell padrão |
previous_shell |
string | Shell anterior (Bash/Zsh/Fish) |
setup_completed |
boolean | Se o setup foi completado |
aensh/
├── Cargo.toml # Dependências e metadata
├── Cargo.lock # Lock de versões
├── README.md # Este arquivo
├── CONTEXT.md # Contexto do projeto
├── LICENSE # Licença MIT
├── install.sh # Script de instalação
│
├── src/
│ ├── main.rs # Entry point, CLI, main loop
│ │
│ ├── core/ # Módulos principais
│ │ ├── mod.rs # Exports
│ │ ├── aliases.rs # Sistema de aliases
│ │ ├── banner.rs # Banner de inicialização
│ │ ├── command.rs # Struct Command
│ │ ├── config.rs # Configuração
│ │ ├── errors.rs # Tipos de erro
│ │ ├── external.rs # Comandos externos
│ │ ├── history.rs # Histórico
│ │ ├── pipeline.rs # Parser e executor
│ │ ├── plugins.rs # Sistema de plugins
│ │ ├── prompt.rs # Geração do prompt
│ │ ├── readline.rs # Input com setas
│ │ └── setup.rs # Setup inicial
│ │
│ └── builtins/ # Comandos built-in
│ ├── mod.rs # Dispatcher
│ ├── filesystem/ # ls, cat, mkdir, etc
│ ├── navigation/ # cd, pwd
│ ├── shell/ # help, exit, alias, plugin
│ └── system/ # echo, clear, env, etc
│
├── docs/ # Documentação
│ ├── QUICK_START.md
│ ├── USAGE.md
│ └── ...
│
└── target/ # Build output
├── debug/
└── release/
| Módulo | Responsabilidade |
|---|---|
aliases.rs |
Gerenciamento de aliases (~/.aenshrc) |
banner.rs |
Banner ASCII de inicialização |
command.rs |
Estrutura Command (nome + args) |
config.rs |
Configuração persistente |
errors.rs |
Tipos de erro (AenshError, AenshResult) |
external.rs |
Execução de comandos externos |
history.rs |
Histórico persistente |
pipeline.rs |
Parser de comandos e pipelines |
plugins.rs |
Sistema de plugins |
prompt.rs |
Geração do prompt colorido |
readline.rs |
Input com navegação por setas |
setup.rs |
Setup inicial interativo |
| Categoria | Comandos |
|---|---|
shell/ |
help, exit, alias, plugin |
navigation/ |
cd, pwd |
filesystem/ |
ls, cat, mkdir, touch, rm, cp, mv, find, grep, tree, head, tail, wc |
system/ |
echo, clear, info, whoami, date, stat, env, export, unset, history, which, type |
main()
│
├─► handle_args() # Processa --help, --version, etc
│
├─► check_and_run_setup() # Setup inicial se necessário
│
├─► show_banner() # Exibe banner ASCII
│
└─► loop {
│
├─► build_prompt() # Gera prompt colorido
│
├─► readline.read_line() # Lê input com setas
│
├─► alias_manager.expand() # Expande aliases
│
├─► parse_command_chain() # Parse: cmd1 && cmd2 | cmd3
│
└─► execute_chain() # Executa pipeline
}
O parser suporta:
- Comandos simples:
ls -la - Piping:
ls | grep txt - Encadeamento:
mkdir dir && cd dir - Combinação:
cat file | grep pattern && echo done
enum PipelineSegment {
Builtin(Command), // Comando built-in do Aensh
Plugin(Command), // Plugin registrado
External(Command), // Comando do sistema
}
struct Pipeline {
segments: Vec<PipelineSegment>, // Separados por |
}
struct CommandChain {
pipelines: Vec<Pipeline>, // Separados por &&
}- Rust 1.70+:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - Cargo: Vem com Rust
- Git: Para controle de versão
# Clone o repositório
git clone https://github.com/aencyorganization/aensh.git
cd aensh
# Build debug (rápido, com símbolos de debug)
cargo build
# Build release (otimizado)
cargo build --release
# Executar diretamente
cargo run
# Executar com argumentos
cargo run -- --help# Verificar compilação
cargo check
# Lint com Clippy
cargo clippy
# Formatar código
cargo fmt
# Testar build release
cargo build --release
./target/release/aensh --version- Fork o repositório
- Clone seu fork:
git clone https://github.com/seu-usuario/aensh.git - Crie uma branch:
git checkout -b feature/nova-feature - Faça suas mudanças
- Commit:
git commit -m 'Add nova feature' - Push:
git push origin feature/nova-feature - Abra um Pull Request
// Funções e variáveis: snake_case
fn minha_funcao() {}
let minha_variavel = 42;
// Tipos e traits: PascalCase
struct MeuStruct {}
trait MeuTrait {}
// Constantes: UPPER_CASE
const MINHA_CONSTANTE: i32 = 42;
// Erros: sempre retornar AenshResult<T>
pub fn run(args: &[String]) -> AenshResult<()> {
Ok(())
}
// Cores: usar colored::*
use colored::*;
println!("{} OK", "✓".green());
eprintln!("{} Erro", "✗".red());- Crie o arquivo em
src/builtins/<categoria>/novo_comando.rs - Implemente a função
run(args: &[String]) -> AenshResult<()> - Adicione ao
mod.rsda categoria - Adicione ao
SUPPORTED_COMMANDSemsrc/builtins/mod.rs - Adicione ao
dispatch()emsrc/builtins/mod.rs - Adicione à lista de bloqueados em
src/core/plugins.rs
Não automaticamente. Você pode usar o Aensh como um programa normal ou configurá-lo para iniciar automaticamente com aensh --default true.
Sim! O Aensh executa qualquer comando do sistema que não seja um built-in. Comandos como curl, git, python, docker, etc. funcionam normalmente.
- Digite
exitou pressioneCtrl+Dpara sair do Aensh - Para desativar a inicialização automática:
aensh --default false
- Aliases:
~/.aenshrc - Configuração:
~/.config/aensh/config.json - Histórico:
~/.aensh_history - Plugins:
~/.config/aensh/plugins/
Não diretamente. O Aensh tem sua própria sintaxe. Para scripts bash, use bash script.sh.
Abra uma issue em: https://github.com/aencyorganization/aensh/issues
Instale Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/envAdicione permissão de execução:
chmod +x target/release/aenshAdicione ao PATH:
export PATH="$HOME/.local/bin:$PATH"Limpe e reconstrua:
cargo clean
cargo build --releaseVerifique se o comando existe:
aensh> which comando
aensh> type comandoRecarregue o arquivo:
aensh> reload- Shell funcional básico
- Comandos built-in (30+)
- Navegação com setas
- Histórico persistente
- Piping e encadeamento
- Sistema de aliases
- Setup inicial interativo
- Comandos externos
- Autocompletar com Tab
- Wildcards (*, ?, [])
- Busca no histórico (Ctrl+R)
- Mais comandos built-in
- Variáveis de ambiente persistentes
- Redirecionamento (>, >>)
- Entrada padrão (<)
- Subshells
- Scripts Aensh
- Funções
- Jobs (bg, fg)
- Temas customizáveis
- Configuração avançada
Este projeto está licenciado sob a MIT License.
MIT License
Copyright (c) 2024 Aency Organization
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Aency Organization - @aencyorganization
| Crate | Versão | Descrição |
|---|---|---|
nix |
0.27 | Bindings Unix |
libc |
0.2 | Bindings C |
colored |
2.1 | Cores no terminal |
gethostname |
0.4 | Nome do host |
crossterm |
0.27 | Terminal cross-platform |
dirs |
5.0 | Diretórios do sistema |
serde |
1.0 | Serialização |
serde_json |
1.0 | JSON |
- Bash - O shell clássico
- Zsh - Recursos avançados
- Fish - Interface amigável
- Nushell - Shell moderno em Rust
Feito com ❤️ em Rust 🦀
