Meu shell de login é zsh. Adicionei as duas linhas seguintes ao meu .zprofile
arquivo:
path+=$HOME/foobar123
alias foo='echo bar'
Então, se eu alternar para bash ou fish, digitando bash
ou fish
e pressionando Return, echo $PATH
a parte continuará sendo exibida foobar123
, mas o foo
alias não funcionará.
Por que isso? Por que aliases e modificações de caminho são tratados de forma diferente?
path
é a variável de matriz do shell que está vinculada àPATH
variável do shell que, por sua vez, está vinculada àPATH
variável de ambiente.Ao executar um comando, toda a memória de um processo é apagada.
Variáveis de ambiente são uma maneira de passar dados pela execução. Assim como os argumentos de comando, elas são uma lista de strings delimitadas por NUL, mas, ao contrário dos argumentos, por convenção:
VAR=values
putenv()
variávelsetenv()
, ,unsetenv()
,environ
) para manter essa lista de variáveis de ambiente lembradas (o environ), e para executar comandos, passando essa lista adiante (execl()
,execvp()
... que são wrappers em torno daexecve()
chamada do sistema).Shells especificamente, além de fazer isso, criam uma variável em sua linguagem para algumas das variáveis de ambiente que recebem e cujo nome é compatível com o de uma variável de shell. E os do tipo Bourne podem promover uma variável de shell para uma variável de ambiente com o
export
builtin (outros shells têm equivalentes).csh, tcsh, zsh, yash e fish shells têm maneiras de vincular
$PATH
ou outras variáveis com:
valores separados por - (geralmente os de ambiente, comoPATH
) a variáveis de array.Para efeito de comparação, o Perl (também um interpretador de linguagem de programação, mas não um shell) mapeia variáveis de ambiente para seus
%ENV
arrays associativos (por exemplo, aPATH
variável de ambiente está disponível em$ENV{PATH}
),awk
o mesmo que oENVIRON["PATH"]
,vim
tem$var
para variáveis de ambiente enquanto é apenasvar
para suas próprias variáveis ou@x
para registradores, etc.Para resumir, variáveis de ambiente, como
PATH
são algo universal, compreendido por tudo e herdado (por convenção) ao longo da execução.Não há equivalente para aliases de shell, que é um recurso (ruim) de alguns shells (não todos) inicialmente do csh, cuja sintaxe varia de shell para shell, nem de outras estruturas de dados de qualquer linguagem.
Alguns shells como
rc
e derivados oubash
podem exportar suas próprias funções (também arrays emrc
e derivados), e para fazer isso, eles sequestram variáveis de ambiente, onde a definição da função é armazenada em um formato específico, mas somente outras instâncias do mesmo shell podem carregar essas variáveis do ambiente e recriar as funções (ou arrays) que eles codificaram. Essas variáveis não fazem sentido para outros shells (ouperl
,vim
,awk
...) cuja sintaxe é diferente de qualquer maneira.Para poder passar sua lista de aliases zsh para
bash
que aliases bash equivalentes sejam criados, você precisa criar um código nabash
linguagem que, uma vez avaliado, recriaria esses aliases.bash
ezsh
têm alguma sintaxe em comum, em particular aalias
sintaxe básica interna foi copiada em ambos do shell Korn em vez do csh, mas o zsh adicionou mais recursos, como aliases globais ou aliases de sufixo, e não tem as mesmas limitações do bash quando se trata de nomes de aliases, e os do bash não podem conter NULs nem no nome nem no valor, então nem todos os aliases zsh podem ser convertidos em aliases bash.A sintaxe de aspas também é diferente entre os dois shells, embora eles entendam aspas simples da mesma maneira (desde que
rcquotes
não estejam habilitadas emzsh
). O zsh disponibiliza a lista de seus aliases simples na$aliases
matriz associativa especial e, da mesma forma,bash
pode despejar uma lista de definições de alias comalias -L
.Mas no último, ele nem sempre usa aspas simples e pode despejar aliases cujos nomes ou valores não funcionariam no bash, então seria melhor fazer um loop
$aliases
, filtrar aqueles que não funcionambash
e fazer as aspas manualmente (como com oqq
sinalizador de expansão de parâmetros).