Eu uso o Bash como meu shell interativo e fiquei imaginando se havia uma maneira fácil de fazer com que o Bash execute um comando do sistema em vez de um comando interno do shell no caso em que ambos compartilham o mesmo nome.
Por exemplo, use o sistema kill
(de util-linux
) para imprimir o ID do processo (pid) do (s) processo (s) nomeado (s) em vez de enviar um sinal:
$ /bin/kill -p httpd
2617
...
Sem especificar o caminho completo do comando do sistema, o Bash interno é usado em vez do comando do sistema. O kill
builtin não tem a -p
opção, portanto, o comando falha:
$ kill -p httpd
bash: kill: p: invalid signal specification
Tentei as respostas listadas em Faça com que o bash use o comando externo `time` em vez do shell interno, mas a maioria deles funciona apenas porque time
é na verdade uma palavra - chave shell - não um shell embutido .
Além de desabilitar temporariamente o Bash enable -n kill
, a melhor solução que vi até agora é usar:
$(which kill) -p httpd
Existem outras maneiras mais fáceis (envolvem menos digitação) de executar um comando externo em vez de um shell embutido?
Observe que kill
é apenas um exemplo e eu gostaria de uma solução generalizada semelhante à maneira como o prefixo com o command
builtin impede que funções com o mesmo nome de um comando externo sejam executadas. Na maioria dos casos, eu geralmente prefiro usar a versão embutida, pois economiza a bifurcação de um novo processo e, algumas vezes, o embutido possui recursos que o comando externo não possui.
fonte
which kill
de backticks (não é possível colocá-los nos comentários) é um pouco menor.$(…)
- veja isto , isto e aquilo .Respostas:
Assumindo que
env
está no seu caminho:env
executa o arquivo executável nomeado pelo seu primeiro argumento em um ambiente (possivelmente) modificado; como tal, não conhece ou trabalha com comandos internos do shell.Isso produz algum cruft de controle de tarefa do shell, mas não depende de um comando externo:
exec
requer um executável para substituir o shell atual, portanto, não usa nenhum built-in. O trabalho é executado em segundo plano para que você substitua o shell em segundo plano bifurcado, não o shell atual.fonte
env
é claramente a resposta certa IMHO.command -p cmd
chamando comando externozsh
, nãobash
.(exec kill -p http)
faz com que o trabalho substitua um sub-shell em vez do seu shell atual e você não precisa lidar com o cruft de controle do trabalho.env
também não sabe sobre os componentes internos do shell, já que não é um shell. Você deseja obter o mesmo efeito comnice
ouxargs
ou qualquer outro programa como esse.A maneira mais simples de fazer o que você quer pode ser colocar a linha
no seu
~/.bashrc
arquivo. Depois disso, cada novo login / invocação do bash interpretará "kill" como/bin/kill
.fonte
command
solução) em vez de criar um alias separado para cada comando "sombreado". Agora editei minha pergunta para tornar isso mais claro e explícito. Na maioria dos casos, geralmente prefiro usar a versão interna, pois os processos podem ser especificados por IDs de trabalho. Obrigado de qualquer maneira.Se você conhece uma solução que requer digitação e deseja uma solução que requeira menos digitação, crie-a:
Abreviar coisas que normalmente exigem algum esforço é o que os computadores se destacam.
fonte
Nesse caso muito específico, o comando
pgrep
é uma correspondência exata para a necessidade.Em um sentido geral, uma função funciona. Do "comando de arquivo":
chamar como
Mas se você precisar de menos digitação, não há maneira mais curta do que um bom alias.
Do conceito "list pid" (lp):
então, digite:
fonte
(No zsh) Você pode prefixar qualquer nome de comando com um sinal = para obter a versão do sistema em vez de incorporada. Essa também é uma maneira útil de evitar aliases que atrapalhem um cenário específico.
fonte
zsh
única coisa. Uso-o regularmente, mas vou verificar abash
partir de um computador amanhã.zsh
. Enquanto eu marquei esta questãobash
e a usei no título, você deve manter essa resposta, pois um usuário do zsh ainda a achará útil.Você pode enviar um relatório de erros em sua página de
kill
manual e perguntar por que isso inclui opções não padrão que são retiradaspkill
e usadaspkill
sempre que você deseja obter os recursos.pkill.
Se você ligar para:
pkill httpd
você evita os problemas que você descreve.
fonte