Se eu tiver um utilitário de linha de comando foo
instalado por algum programa e ele não for adicionado ao $PATH
, e eu quiser ter uma maneira fácil de usá-lo, parece que há três opções:
crie um link simbólico, geralmente em
/usr/local/bin
ou talvez$HOME/bin
:ln -s /path/to/foo /usr/local/bin/foo
em vez de criar um link simbólico, crie um executável:
echo 'path/to/foo' > /usr/local/bin/foo chmod a+rx /usr/local/bin/foo
ou edite
.zshrc
e defina um alias:alias foo='/path/to/foo'
Minhas perguntas:
- Está correto?
- E qual dessas opções é a "melhor" (OK, eu sei que é uma maneira ingênua de perguntar...) ou pelo menos a preferida com mais frequência?
Uma solução óbvia é adicionar o diretório que contém o programa à sua
PATH
configuração . Isso é comumente praticado no Windows, mas não no Unix. Há várias razões pelas quais isso não é uma boa ideia:PATH
é principalmente para chamadas de programa para programa.)PATH
, e em particular remover entradas obsoletas após desinstalar um programa. (O Windows resolve isso parcialmente deixando o instalador do programa cuidar daPATH
configuração. Mas muitos programas não vêm com um desinstalador funcional.)Criar um link simbólico em
/usr/local/bin
(para programas instalados em todo o sistema) ou~/bin
(para programas instalados na sua conta — você pode escolher um local diferente se quiser) (sugestão 1 na pergunta) é uma boa solução. Ele torna os programas recém-instalados imediatamente disponíveis para todos os potenciais chamadores. A instalação requer apenas a criação de um link simbólico. A desinstalação requer apenas a remoção de um link simbólico. Se você esquecer de desinstalar o link simbólico, você pode facilmente limpar: basta remover todos os links simbólicos pendurados.Uma dificuldade com essa abordagem é que é tedioso lembrar de criar o link. Felizmente, existem ferramentas para isso: Stow ou uma de suas alternativas, como XStow . Veja Mantendo o controle de programas .
Stow e XStow também cuidam de tornar os recursos associados disponíveis, por exemplo, páginas de manual. Após desinstalar um programa, eles podem remover links simbólicos pendurados.
Existem alguns programas que não funcionam corretamente quando você os invoca por meio de um link simbólico, porque eles esperam encontrar outros arquivos no mesmo diretório (ou em um diretório próximo, por exemplo, quando você executa
/path/to/bin/foo
, ele procura por/path/to/lib/foolib
). A maioria dos programas que fazem isso olham para o alvo do link, mas de vez em quando você encontrará um que olha para o próprio link. Com esse programa, use o método wrapper de script de shell abaixo.Um wrapper de script de shell (sugestão 2 na pergunta) funciona, mas não é conveniente. Você tem que escrever esse wrapper para cada programa. Você tem que lembrar de removê-lo na desinstalação. Ele não cuida de recursos associados, como páginas de manual. Então é mais um método de fallback quando a abordagem de symlink não é boa o suficiente.
Uma vantagem da abordagem do wrapper de script de shell é que ele lhe dá controle sobre o caminho exato pelo qual você invoca o executável, caso o programa se importe com isso. Isso também permite que você defina variáveis de ambiente, para programas que precisam de configurações especiais em seu ambiente que você não quer carregar para todo lugar. Ele também lhe dá uma oportunidade de limpar depois que o programa existir, se o programa deixar lixo por aí (por exemplo, programas que não limpam seus arquivos temporários).
Aqui está um wrapper de script de shell mínimo que cuida para fazer as coisas de forma limpa. Em particular, ele passa todos os argumentos de linha de comando corretamente. Ele também toma cuidado para não deixar o processo do wrapper de shell por aí, o que ocasionalmente importa se você estiver fazendo algum tipo de monitoramento de processo.
Um alias de shell funciona somente quando você chama o programa diretamente de um shell interativo. Ele não funciona de outros programas, ou de instâncias de shell já em execução, ou de tarefas agendadas, ou via utilitários como
find -exec
orxargs
, etc. Não consigo pensar em um bom motivo para usar esse método.Nunca tive um Mac, mas faço isso com um
alias
constantemente. Se.zshrc
for o equivalente de Mac para.bashrc
, então apenas adicione:Então execute:
touch ~/.zsh_aliases
Agora, basta usar qualquer editor de texto para adicionar todos os seus aliases a esse arquivo, e ele será carregado automaticamente na inicialização. Você pode
reboot
digitar ousource ~/.zshrc
(ou.
, como acima, é o mesmo que source) para fazer isso sem reiniciar.Alguns
.zsh_aliases
exemplos diretamente do meu arquivo:Não tenho certeza se há um
zsh
equivalente parabash -c
, mas não deve ser necessário. Use-o com o caminho completo comoconctvid
e você pode executar esse script, executável ou qualquer coisa, de qualquer diretório com argumentos e tudo. O aliasmdedit
abre meu editor markdown baseado em navegador no firefox. Você pode fazer muita coisa.Eu até tenho o alias
aka
, para editar meu arquivo de aliases comnano
, e executarsource
na saída: