Kodumaro :: Fish Shell

Publicado em 15 de Junho, 2016
As sombras da programação.

Há há mais de um ano não uso mais Bash – tenho usado Zsh. Agora resolvi dar uma change ao Fish Shell.

Fish Shell – Friendly Interactive Shell – é um shell para sistemas Posix com uma pegada mais amigável (user friendly) que os demais shells.

É considerado um shell exótico por sua sintaxe não derivar nem do Bourne Shell, nem do CShell. Sua sintaxe é muito mais parecida com Tcl/Tk e Lua.

Você pode encontrar a documentação aqui.

suas principais características são:

  • Autossugestão conforme a digitação;
  • Facilmente escriptável;
  • Autocomplete para páginas de manual;
  • Cores VGA em 24 bits;
  • Comando de ajuda chama páginas de hipertexto;
  • Funcionalidades “fora da caixa”, segundo os autores.

A princípio, usando Fish, parece ser apenas um shell cheio de firulas, mas as diferenças vão surgindo com o tempo.

Ao contrário de outros shells, o arquivo de carga inicial de login shell não segue o padrão ~/.nomedoshrc, mas se encontra em ~/.config/fish/config.fish.

Outra característica muito importante é que, sempre que você executa um comando, o Fish procura um arquivo~/.config/fish/functions/comando.fish e, encontrando, o executa. O objetivo é carregar sob demanda funções definidas pelo usuário.

Duas funções que são chamadas recorrentemente – e podem ser definidas em ~/.config/fish/functions/ – são fish_prompt e fish_title:

fish_prompt é chamada sempre imediatamente antes do prompt ser oferecido ao usuário e tem a função de construir a mensagem do prompt.

fish_title é chamada a cada vez que algum outro software – como xterm – solicita o título.

Scripting

Vamos a um script de exemplo: criaremos uma função rmpyc que limpa os arquivos .pyc do diretório informado. Crie um arquivo ~/.config/fish/functions/rmpyc.fish:

function rmpyc
  let -l pathes
  if test (count $argv) = 0
    set pathes .
  else
    set pathes $argv
  end

  for dir in $pathes
    find "$dir" -type d -name __pycache__ -exec -rf {} \;
    find "$dir" -name "*.pyc" -delete
  end
end

O programa verifica se há mais de um argumento, em não havendo, usa o diretório atual (.).

Para cada diretório passado, são executados dois comando de find: um para arquivos de Python 3.x, outro para Python 2.7. Repare na clareza dos comandos if e for, no uso da palavra chave end.

Lidando com listas

Fish Shell tem um suporte muito bom e intuitivo a listas. Por exemplo, para adicionar um novo path à variável PATH:

set -x PATH $PATH $HOME/bin

Você pode usar for para reiterar listas:

for path in $PATH
  echo "$path está em PATH"
end

É também possível usar listas literais:

for letter in A E I O U
  echo "Vogal: $letter"
end

Um dos recursos mais poderosos de Fish é o produto cartesiano de listas. Por exemplo: uma forma de construir a variável LUA_PATH é usando produto cartesiano:

set -l directories
set -l suffixes ?.lua ?.lc ?/init.lua ?/init.lc

for dir in /usr/share/lua/5.1 /usr/share/lua/scilua /usr/local/share/lua/5.1 /usr/local/share/lua/scilua
  if test -e $dir
    set directories $directories $dir
  end
end

set -l lua_path $directories/$suffixes
set -x LUA_PATH (string join ';' -- $lua_path)

Lidando com strings

Outro recurso de Fish é a ferramenta string: basicamente ela traz suporte a contar o tamanho de uma string, pegar substrings, quebrar em listas, juntar uma lista em uma string, etc.

Por exemplo, para converter o path para o formato Mac OS:

function to-mac-os-path -a original_path
  set -l path (string split / -- "$original_path")
  string join : -- $path[2..(count $path)]
end

Outra alternativa para fazer a mesma coisa:

function to-mac-os-path -a path
  string replace -a / : -- (string trim -l -c/ -- "$path")
end

Buscando ajuda

Os manuais de ajuda podem ser obtidos on-line, ou digitando o comando help, que direcionará o usuário para o navegador, apontando para o arquivo de ajuda que vem junto com a instalação de Fish.

fish> help string
fish>

Shell