Como declarar alguns alias dinamicamente em zsh?

2

Eu gostaria de declarar alguns comandos de atalho para alternar entre meus vários projetos de codificação, então eu criei o seguinte script.

projects=$(ls -d ~/Workspace/*/)
prefix="/Users/myuser/Workspace/"
for f in $projects
do
        temp=${f#$prefix}
        temp=${temp/%\//}
        c="alias $temp='cd $f'"
        echo $c
        eval $c
done

Eu coloquei isso em um arquivo chamado .workspace-shotcuts.sh em minha homefolder, então eu chmod +X .workspace-shotcuts.sh it. quando eu executo, usando ./.workspace-shotcuts.sh eu recebo

alias project1='cd /Users/myuser/Workspace/project1/'
alias project2='cd /Users/myuser/Workspace/project2/'

no console. Mas os aliases não são declarados ( zsh: command not found: project1 ).

Além disso, no final do meu arquivo .zshrc , adicionei /bin/sh .workspace-shotcuts.sh , que fornece a mesma saída, mas ainda sem aliases.

Qualquer corpo pode me dizer o que estou perdendo? Eu gostaria de salientar que eu não sou um ótimo usuário * nix, então você pode ter que ELI5 algumas coisas para mim.

EDITAR:

Foi sugerido usar source , o que eu fiz, mas aqui estão as mensagens de erro:

(eval):2: permission denied: /Users/myuser/Workspace/project1/
(eval):3: permission denied: /Users/myuser/Workspace/project2/    
(eval):4: permission denied: /Users/myuser/Workspace/project3/
(eval):5: permission denied: /Users/myuser/Workspace/project4/
(eval):6: permission denied: /Users/myuser/Workspace/project5/
(eval):7: permission denied: /Users/myuser/Workspace/project6/
(eval):8: permission denied: /Users/myuser/Workspace/project7/
(eval):9: no such file or directory: /Users/myuser/Workspace/project1=cd /Users/myuser/Workspace/project1/\n/Users/myuser/Workspace/project2/\n/Users/myuser/Workspace/project3/\n/Users/myuser/Workspace/project4/\n/Users/myuser/Workspace/project5/\n/Users/myuser/Workspace/project6/\n/Users/myuser/Workspace/project7/

O que está acontecendo? Existe alguma permissão especial que eu preciso para dar o meu script?

    
por ɭɘ ɖɵʊɒɼɖ 江戸 13.12.2015 / 03:39

1 resposta

4

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
    
por 14.12.2015 / 20:41