J'utilise Bash comme shell interactif et je me demandais s'il y avait un moyen facile de faire exécuter à Bash une commande système au lieu d'une commande intégrée au shell dans le cas où ils partagent tous les deux le même nom.
Par exemple, utilisez le système kill
(from util-linux
) pour imprimer l'ID de processus (pid) du ou des processus nommés au lieu d'envoyer un signal:
$ /bin/kill -p httpd
2617
...
Sans spécifier le chemin complet de la commande système, la fonction intégrée Bash est utilisée à la place de la commande système. Le programme kill
intégré n'a pas l' -p
option, donc la commande échoue:
$ kill -p httpd
bash: kill: p: invalid signal specification
J'ai essayé les réponses listées dans Make bash use external `time` command plutôt que shell built-in mais la plupart d'entre elles ne fonctionnent que parce qu'il time
s'agit en fait d'un mot clé shell - pas d'un shell intégré .
Outre la désactivation temporaire de la fonction intégrée de Bash enable -n kill
, la meilleure solution que j'ai vue jusqu'à présent consiste à utiliser:
$(which kill) -p httpd
Existe-t-il d'autres moyens plus simples (impliquant moins de frappe) d'exécuter une commande externe au lieu d'un shell intégré?
Notez que ce kill
n'est qu'un exemple et j'aimerais une solution généralisée similaire à la façon dont le préfixe avec le command
code intégré empêche les fonctions qui ont le même nom qu'une commande externe d'être exécutées. Dans la plupart des cas, je préfère généralement utiliser la version intégrée car elle évite de lancer un nouveau processus et, parfois, la fonction intégrée possède des fonctionnalités que la commande externe ne possède pas.
la source
which kill
fermeture en guillemets (ne peut pas les mettre dans les commentaires) est légèrement plus courte.$(…)
- voyez ceci , ceci et ceci .Réponses:
En supposant que
env
vous êtes sur votre chemin:env
exécute le fichier exécutable nommé par son premier argument dans un environnement (éventuellement) modifié; en tant que tel, il ne connaît pas ou ne fonctionne pas avec les commandes intégrées du shell.Cela produit une perte de contrôle du travail shell, mais ne s'appuie pas sur une commande externe:
exec
nécessite un exécutable pour remplacer le shell actuel, donc n'utilise aucun module intégré. Le travail est exécuté en arrière-plan afin que vous remplaciez le shell d'arrière-plan fourchu, pas votre shell actuel.la source
env
est clairement la bonne réponse à mon humble avis.command -p cmd
appeler une commande externezsh
, nonbash
.(exec kill -p http)
oblige le travail à remplacer un sous-shell au lieu de votre shell actuel et vous n'avez pas à gérer la perte de contrôle du travail.env
ne sait pas non plus sur les commandes internes du shell, car ce n'est pas un shell. Vous obtiendriez le même effet avecnice
ouxargs
ou tout autre programme comme ça.La façon la plus simple de faire ce que vous voulez pourrait être de mettre la ligne
dans votre
~/.bashrc
fichier. Après cela, chaque nouvelle connexion / invocation de bash interprétera "kill" comme/bin/kill
.la source
command
solution) plutôt que de créer un alias distinct pour chaque commande "masquée". J'ai maintenant modifié ma question pour la rendre plus claire et plus explicite. Dans la plupart des cas, je préfère généralement utiliser la version intégrée car les processus peuvent être spécifiés par des ID de travail. Merci quand même.Si vous connaissez une solution qui nécessite un peu de frappe et que vous voulez une solution qui nécessite moins de frappe, construisez-la:
Abréger des trucs qui prend normalement un peu d'effort est ce que les ordinateurs excellent.
la source
Dans ce cas très spécifique, la commande
pgrep
correspond exactement au besoin.Dans un sens général, une fonction fonctionne. De la "commande de fichier":
appeler comme
Mais si vous avez besoin de moins de frappe, il n'y a pas de moyen plus court qu'un bon alias.
Du concept "list pid" (lp):
puis, tapez simplement:
la source
(En zsh) Vous pouvez préfixer n'importe quel nom de commande avec un signe = pour obtenir la version du système au lieu d'une fonction intégrée. C'est également un moyen pratique d'esquiver les alias qui gâchent un scénario spécifique.
la source
zsh
seule chose. Je l'utilise régulièrement mais je vérifierai àbash
partir d'un ordinateur demain.zsh
. Bien que j'aie marqué cette question avecbash
et l' ai utilisée dans le titre, vous devriez garder cette réponse car un utilisateur zsh la trouverait toujours utile.Vous pouvez envoyer un rapport de bogue sur votre
kill
page de manuel et demander pourquoi cela inclut des options non standard qui sont extraites depkill
et utiliséespkill
chaque fois que vous voulez obtenir les fonctionnalités depkill.
Si vous appelez:
pkill httpd
vous évitez les problèmes que vous décrivez.
la source