Wo ist der Lesebefehl?

7

Ich wollte den readBefehl finden, also tat ich:

$ which read

Es gibt den Exit-Status 1 zurück. Warum passiert das?

Mohammad Kholghi
quelle
2
readist ein basheingebauter Befehl, kein eigenständiger Befehl. Hier finden Sie Informationen über readin man bash( manpages.ubuntu.com/manpages/bionic/en/man1/bash.1.html )
waltinator
2
Wie in einem Kommentar zu einer früheren Frage von Ihnen angegeben, wird dies erklärt. readist in bash eingebaut. Für diesen Befehl gibt es keine exectuable.
PerlDuck
1
Wenn Sie Details zur Syntax erfahren möchten read, können Sie den Befehl ausführen help read. Siehe diesen Link für weitere Details
Sudodus
echoist ein eingebauter Befehl, hat aber einen ausführbaren Pfad. @waltinator @PerlDuck
Mohammad Kholghi
2
@waltinator Sie haben Recht, dass das echoeingebaute 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 -eOption ü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 das echoeingebaute System (falls vorhanden!) Und der externe Befehl (der vorhanden sein muss) weitgehend ähnlich verhalten. Aber mit Bash und /bin/echoin Ubuntu und den meisten anderen GNU / Linux-Systemen tun sie dies.
Eliah Kagan

Antworten:

18

readist eine eingebaute Shell, kein externer Befehl. whichinformiert Sie nur über externe Befehle. Angenommen, Sie verwenden Bash (oder eine andere Shell im Bourne-Stil), sollten Sie normalerweise typeoder command -vanstelle von verwenden which.

ek@Cord:~$ type read
read is a shell builtin

typeund commandsind selbst Shell-Builtins und wissen nicht nur über externe Befehle Bescheid, sondern auch über Schlüsselwörter, Builtins, Aliase und Funktionen. whichist ein externer Befehl, der nichts über diese Dinge weiß; es kennt nur externe Befehle. Manchmal whichaufdrehen 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.

ek@Cord:~$ type type command which
type is a shell builtin
command is a shell builtin
which is /usr/bin/which

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:

ek@Cord:~$ type -a read
read is a shell builtin
ek@Cord:~$ type -a echo
echo is a shell builtin
echo is /bin/echo

Weitere Informationen darüber, warum Sie normalerweise nicht verwenden whichsollten und was Sie stattdessen in verschiedenen Shells, einschließlich Bash, verwenden sollten, finden Sie unter Warum nicht "welche" verwenden? Was ist dann zu verwenden?

Eliah Kagan
quelle
1
Wie cd, readist immer ein builtin , weil es ändert internen Zustand der Schale, so könnte es nicht als separates Programm implementiert werden.
Simon Richter
1

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, so read 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 sie readnoch gefunden wird, in die Schale eingebaut werden muss.

U. Windl
quelle
4
einfach da Kumpel. Ihre Informationen sind korrekt, aber die Art und Weise, wie Sie sie geschrieben haben, klingt ein wenig arrogant. Viele Leute haben kein tiefes Wissen darüber, wie Linux funktioniert, und für viele ist dieses Wissen ansonsten nicht nützlich
520
@ U.Windl Beim Ausführen von bash unter Ubuntu wird which readkeine Nachricht gedruckt . Es scheint, dass Sie sich auf einem System befinden, dessen whichausführbare Datei von GNU bereitgestellt wird . Aber /bin/whichin Ubuntu ist von debianutils . Einige Muscheln haben einen whicheingebauten, Bash jedoch nicht. Das Verhalten des externen Befehls ist whichje nach Betriebssystem sehr unterschiedlich, auch in GNU / Linux-Distributionen. Dies ist einer von mehreren Gründen, um typeoder zu bevorzugen command -v. ( Auf einigen Betriebssystemen whichist sogar ein CSH-Skript. )
Eliah Kagan
Was meinen Sie mit "aus der Syntax (lesen Sie var1 var2 ...) sollte ersichtlich sein, dass kein externes Programm eine lokale Shell-Variable setzen kann"? Ich habe es noch nie gehört.
Mohammad Kholghi
@Mohammad Kholghi: Versuchen Sie, einen Befehl in einer beliebigen Sprache (einschließlich eines Shell-Skripts) zu schreiben, der eine Shell-Variable festlegt, die nach dem Ende des Befehls noch vorhanden ist. Das habe ich gemeint: Alle Variableneinstellungen in einem Prozess sind weg, wenn der Prozess beendet wird. Denken Sie vielleicht wirklich darüber nach und überlegen Sie dann, wie ein externes readProgramm funktionieren soll.
U. Windl
1
@ 520 Ich stimme diesen Bemerkungen zu - es ist am besten, das Warum und das Wie zu kommunizieren und nicht so sehr Annahmen über das Vorwissen zu treffen, schließlich ist dies eine Q & A-Site für Leute, die oft versuchen, neue Dinge zu lernen. Was Sie in dieser Antwort angesprochen haben, ist interessant und es wäre viel hilfreicher mit einigen zusätzlichen Details und mit weniger passiver Aggression
gdgr