Ich verwende Bash als interaktive Shell und frage mich, ob es eine einfache Möglichkeit gibt, Bash dazu zu bringen, einen Systembefehl anstelle eines in die Shell eingebauten Befehls auszuführen, wenn beide denselben Namen haben.
Verwenden Sie beispielsweise das System kill
(from util-linux
), um die Prozess-ID (pid) der benannten Prozesse zu drucken, anstatt ein Signal zu senden:
$ /bin/kill -p httpd
2617
...
Ohne Angabe des vollständigen Pfads des Systembefehls wird anstelle des Systembefehls der integrierte Bash verwendet. Das kill
eingebaute Programm hat keine -p
Option, daher schlägt der Befehl fehl:
$ kill -p httpd
bash: kill: p: invalid signal specification
Ich habe versucht, die in Make bash aufgelisteten Antworten mit einem externen `time` -Befehl anstatt mit einer eingebauten Shell zu beantworten, aber die meisten funktionieren nur, weil time
es sich tatsächlich um ein Shell- Schlüsselwort handelt - nicht um eine eingebaute Shell .
Abgesehen von enable -n kill
der vorübergehenden Deaktivierung der Bash-Funktion ist die beste Lösung, die ich bisher gesehen habe, Folgendes :
$(which kill) -p httpd
Gibt es andere einfachere (weniger tippende) Möglichkeiten, einen externen Befehl anstelle einer eingebauten Shell auszuführen?
Beachten Sie, dass dies kill
nur ein Beispiel ist und ich eine verallgemeinerte Lösung möchte , die der Art und Weise ähnelt, in der das command
Präfix mit dem eingebauten Befehl verhindert, dass Funktionen mit demselben Namen wie ein externer Befehl ausgeführt werden. In den meisten Fällen bevorzuge ich in der Regel die integrierte Version, da dadurch ein neuer Vorgang nicht ausgelöst werden kann und in einigen Fällen Funktionen vorhanden sind, die der externe Befehl nicht unterstützt.
quelle
which kill
Einfügen von Backticks (kann nicht kommentiert werden) ist etwas kürzer.$(…)
- sehen Sie dies , dies und das .Antworten:
Vorausgesetzt, es
env
liegt auf Ihrem Weg:env
führt die ausführbare Datei mit dem Namen des ersten Arguments in einer (möglicherweise) geänderten Umgebung aus; Als solches kennt oder arbeitet es nicht mit eingebauten Shell-Befehlen.Dies erzeugt einige Shell Job Control Cruft, ist jedoch nicht auf einen externen Befehl angewiesen:
exec
benötigt eine ausführbare Datei, um die aktuelle Shell zu ersetzen, verwendet also keine eingebauten. Der Job wird im Hintergrund ausgeführt, sodass Sie die gegabelte Hintergrundshell und nicht Ihre aktuelle Shell ersetzen.quelle
env
ist eindeutig die richtige Antwort IMHO.command -p cmd
Externen Befehl aufrufenzsh
, nichtbash
.(exec kill -p http)
Bewirkt, dass der Job eine Sub-Shell anstelle Ihrer aktuellen Shell ersetzt und Sie sich nicht mit der Job-Kontroll-Cruft befassen müssen.env
weiß aber auch nichts über Shell-Builtins, da es keine Shell ist. Sie würden den gleichen Effekt mitnice
oderxargs
oder einem anderen Programm wie diesem erzielen .Der einfachste Weg, um das zu tun, was Sie wollen, könnte darin bestehen, die Linie zu setzen
in deine
~/.bashrc
Datei. Danach interpretiert jeder neue Login / Aufruf von bash "kill" als/bin/kill
.quelle
command
Lösung), anstatt für jeden "schattierten" Befehl einen eigenen Alias zu erstellen. Ich habe jetzt meine Frage bearbeitet, um dies klarer und deutlicher zu machen. In den meisten Fällen bevorzuge ich normalerweise die integrierte Version, da Prozesse durch Job-IDs angegeben werden können. Danke trotzdem.Wenn Sie eine Lösung kennen, die eine Eingabe erfordert, und eine Lösung suchen, die weniger Eingaben erfordert, erstellen Sie sie:
Computer zeichnen sich durch die Verkürzung von Dingen aus, die normalerweise einige Anstrengungen erfordern.
quelle
In diesem speziellen Fall entspricht der Befehl
pgrep
genau den Anforderungen.Im Allgemeinen funktioniert eine Funktion. Von "Dateibefehl":
anrufen als
Wenn Sie jedoch weniger tippen müssen, gibt es keinen kürzeren Weg als einen guten Alias.
Aus dem Konzept "list pid" (lp):
Geben Sie dann einfach Folgendes ein:
quelle
(In zsh) Sie können jedem Befehlsnamen ein = -Zeichen voranstellen, um die Systemversion anstelle eines eingebauten Befehls abzurufen. Dies ist auch eine praktische Möglichkeit, Aliasnamen auszuweichen, die ein bestimmtes Szenario durcheinander bringen.
quelle
zsh
nur eine sache. Ich benutze es regelmäßig, aber ich werdebash
morgen von einem Computer aus nachsehen.zsh
. Obwohl ich diese Frage mit markiertbash
und im Titel verwendet habe, sollten Sie diese Antwort beibehalten, da ein zsh-Benutzer sie dennoch nützlich finden würde.Sie können einen Fehlerbericht zu Ihrer
kill
Manpage senden und fragen, warum dies nicht standardmäßige Optionen enthält, diepkill
verwendet werden,pkill
wenn Sie die Funktionen nutzen möchtenpkill.
Wenn Sie anrufen:
pkill httpd
Sie vermeiden die Probleme, die Sie beschreiben.
quelle