
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:
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.
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
set -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.
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/binVocê 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)
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
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>