AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 786952
Accepted
jsx97
jsx97
Asked: 2024-11-21 03:48:28 +0800 CST2024-11-21 03:48:28 +0800 CST 2024-11-21 03:48:28 +0800 CST

Uma maneira recomendada de usar um utilitário de linha de comando que não é adicionado ao PATH

  • 772

Se eu tiver um utilitário de linha de comando fooinstalado 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:

  1. crie um link simbólico, geralmente em /usr/local/binou talvez $HOME/bin:

    ln -s /path/to/foo /usr/local/bin/foo
    
  2. 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
    
  3. ou edite .zshrce 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?
zsh
  • 2 2 respostas
  • 577 Views

2 respostas

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2024-11-21T04:59:52+08:002024-11-21T04:59:52+08:00

    Uma solução óbvia é adicionar o diretório que contém o programa à sua PATHconfiguração . Isso é comumente praticado no Windows, mas não no Unix. Há várias razões pelas quais isso não é uma boa ideia:

    • Frequentemente, o diretório que contém o executável que você quer também contém arquivos não executáveis, executáveis ​​com os quais você não se importa ou subdiretórios. Eles podem atrapalhar a conclusão. (Isso é menos problemático no Windows, onde a maioria das pessoas não usa a linha de comando, então PATHé principalmente para chamadas de programa para programa.)
    • Você precisa encontrar uma maneira de controlar quais diretórios estão no PATH, e em particular remover entradas obsoletas após desinstalar um programa. (O Windows resolve isso parcialmente deixando o instalador do programa cuidar da PATHconfiguração. Mas muitos programas não vêm com um desinstalador funcional.)
    • Um programa recém-instalado não será acessível a partir de shells em execução e outros programas até que você reinicie os programas de chamada. (O Windows resolve isso parcialmente tendo um “PATH do sistema” e organizando a execução da maioria dos programas por meio de um shell que obedece a esse “PATH do sistema”. Isso exclui a execução de coisas a partir de uma janela de terminal.)
    • Isso não lida com coisas além de executáveis, como páginas de manual. (O Windows resolve isso parcialmente fazendo com que o instalador do programa registre suas páginas de ajuda. Mas isso pressupõe que o programa venha com um instalador.)

    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.

    #!/bin/sh
    exec /path/to/my/weird/executable "$@"
    

    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 -execor xargs, etc. Não consigo pensar em um bom motivo para usar esse método.

    • 12
  2. JayCravens
    2024-11-21T05:40:29+08:002024-11-21T05:40:29+08:00

    Nunca tive um Mac, mas faço isso com um aliasconstantemente. Se .zshrcfor o equivalente de Mac para .bashrc, então apenas adicione:

    if [ -f ~/.zsh_aliases ]; then
        . ~/.zsh_aliases
    fi
    

    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 rebootdigitar ou source ~/.zshrc(ou . , como acima, é o mesmo que source) para fazer isso sem reiniciar.

    Alguns .zsh_aliasesexemplos diretamente do meu arquivo:

    alias pdf2console='bash -c /run/media/jason/HOME/jaypc/Documents/pub/bash/myapps/pdf2console.sh
    alias concatvid='/run/media/jason/HOME/jaypc/Documents/pub/bash/myapps/1_ffmpeg/concat_vid.sh'
    alias mdedit='firefox /home/jason/Documents/htdocs/md2html/md-it/index.html'
    

    Não tenho certeza se há um zshequivalente para bash -c, mas não deve ser necessário. Use-o com o caminho completo como conctvide você pode executar esse script, executável ou qualquer coisa, de qualquer diretório com argumentos e tudo. O alias mdeditabre 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 com nano, e executar sourcena saída:

    alias aka='nano ~/.zsh_aliases && source ~/.zshrc'
    
    • 2

relate perguntas

  • Listar arquivos que não possuem outro arquivo com sufixo

  • Em que circunstâncias o executável encontrado primeiro no caminho não será usado

  • Symlinking para todos os arquivos de ponto e diretórios

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve