Um dos seus problemas é que você executou seu snippet em um processo shell separado, que não tem efeito no shell pai. É o mesmo problema que em Como posso tornar as variáveis de ambiente "exportadas" em um script de shell? . Você precisa usar o source
incorporado (também disponível no site nome .
) para executar o script dentro do mesmo shell.
source ~/.workspace-shotcuts.sh
Outro problema é que você está tentando analisar a saída de ls
. Não faça isso . Em shells como sh e bash, você pode se safar porque escrever $projects
fora de aspas divide o valor nas novas linhas que separam os nomes dos arquivos. Exceto que isso não funciona: por exemplo, se os nomes dos arquivos contiverem espaços, eles serão divididos em partes separadas por espaço. Em um script de shell, não analise a saída de ls
, use caracteres curinga. Isso é bastante simples em zsh.
projects=(~/Workspace/*/)
for f in $projects; do …
O que você está fazendo a seguir é bastante complicado. Você não precisa de eval
aqui; usá-lo apenas prepara você para citar percalços. Como você está usando o zsh, é possível usar o modificador de histórico t
para extrair o último componente de um caminho, sem chegar a construções de manipulação de strings: $f:t
. Caso o nome do arquivo contenha caracteres especiais, você deve protegê-los e, novamente, o zsh torna isso fácil graças à flag de expansão de parâmetro q
: ${(q)f}
fornece um nome de arquivo entre aspas que você pode usar na definição do alias.
projects=(~/Workspace/*/)
for f in $projects
do
alias $f:t="cd ${(q)f}"
done
Mas, na verdade, você está apenas reinventando cdpath
mais auto_cd
. Raspe tudo isso e use
setopt auto_cd
cdpath+=~/Workspace
A opção auto_cd
permite que você digite um nome de diretório para alterá-lo, sem precisar digitar cd
antes dele. O cdpath
é uma matriz de prefixos de diretório que cd foo
tenta se não houver um subdiretório chamado foo
no diretório atual.
Caso os usuários do bash vejam esse segmento: o método do alias seria
projects=(~/Workspace/*/)
for f in "${projects[@]}"; do
f=${f%/}
alias ${f##*/}="cd '${f//\'/\'\\'\'}'"
done
e o método CDPATH
seria
CDPATH=$CDPATH:$HOME/Workspace
shopt -s autocd