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/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)
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>