Ich wollte den read
Befehl finden, also tat ich:
$ which read
Es gibt den Exit-Status 1 zurück. Warum passiert das?
command-line
Mohammad Kholghi
quelle
quelle
read
ist einbash
eingebauter Befehl, kein eigenständiger Befehl. Hier finden Sie Informationen überread
inman bash
( manpages.ubuntu.com/manpages/bionic/en/man1/bash.1.html )read
ist in bash eingebaut. Für diesen Befehl gibt es keine exectuable.read
, können Sie den Befehl ausführenhelp read
. Siehe diesen Link für weitere Detailsecho
ist ein eingebauter Befehl, hat aber einen ausführbaren Pfad. @waltinator @PerlDuckecho
eingebaute Bash nicht mit dem externen Befehl identisch ist/bin/echo
, der in Ubuntu von GNU-Coreutils bereitgestellt wird. Aber beide Stütz Escape - Sequenzen, und beide sie interpretieren , wenn die-e
Option übergeben wird und nicht anders . Im Allgemeinen kann man auf einem beliebigen System mit einer beliebigen Shell im Bourne-Stil nicht sicher sein, ob sich dasecho
eingebaute System (falls vorhanden!) Und der externe Befehl (der vorhanden sein muss) weitgehend ähnlich verhalten. Aber mit Bash und/bin/echo
in Ubuntu und den meisten anderen GNU / Linux-Systemen tun sie dies.Antworten:
read
ist eine eingebaute Shell, kein externer Befehl.which
informiert Sie nur über externe Befehle. Angenommen, Sie verwenden Bash (oder eine andere Shell im Bourne-Stil), sollten Sie normalerweisetype
odercommand -v
anstelle von verwendenwhich
.type
undcommand
sind selbst Shell-Builtins und wissen nicht nur über externe Befehle Bescheid, sondern auch über Schlüsselwörter, Builtins, Aliase und Funktionen.which
ist ein externer Befehl, der nichts über diese Dinge weiß; es kennt nur externe Befehle. Manchmalwhich
aufdrehen nichts , wenn Sie es über einen Befehl bitten Sie können in der Shell verwenden. Manchmal taucht etwas für einen Befehl auf, aber es ist nicht dasselbe , das tatsächlich ausgeführt wird, wenn Sie den Befehl in Ihrer Shell verwenden.In Bash können Sie alle aktuell möglichen Bedeutungen für einen Befehl in der Reihenfolge anzeigen, in der sie versucht werden, mit
type -a
:Weitere Informationen darüber, warum Sie normalerweise nicht verwenden
which
sollten und was Sie stattdessen in verschiedenen Shells, einschließlich Bash, verwenden sollten, finden Sie unter Warum nicht "welche" verwenden? Was ist dann zu verwenden?quelle
cd
,read
ist immer ein builtin , weil es ändert internen Zustand der Schale, so könnte es nicht als separates Programm implementiert werden.Wenn Sie ein wenig wissen , wie UNIX und die Shell - Arbeit, sollte es von der Syntax offensichtlich sein (
read var1 var2 ...
) , dass kein externes Programm kann eine lokale Shell - Variable gesetzt, soread
muss in die Schale eingebaut werden.In bash erhalten Sie nicht nur einen Exit-Code von 1, sondern auch eine Nachricht wie
which: no read in (/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games)
. Das sollte eine Glocke läuten, die, wenn sieread
noch gefunden wird, in die Schale eingebaut werden muss.quelle
which read
keine Nachricht gedruckt . Es scheint, dass Sie sich auf einem System befinden, dessenwhich
ausführbare Datei von GNU bereitgestellt wird . Aber/bin/which
in Ubuntu ist von debianutils . Einige Muscheln haben einenwhich
eingebauten, Bash jedoch nicht. Das Verhalten des externen Befehls istwhich
je nach Betriebssystem sehr unterschiedlich, auch in GNU / Linux-Distributionen. Dies ist einer von mehreren Gründen, umtype
oder zu bevorzugencommand -v
. ( Auf einigen Betriebssystemenwhich
ist sogar ein CSH-Skript. )read
Programm funktionieren soll.