Die yash
Shell hat laut Handbuch eine printf
eingebaute .
In einer yash
Shell mit Standardkonfiguration sehe ich jedoch Folgendes:
kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf
Ist printf
eine in diese Shell eingebaut oder nicht? Das Ergebnis ist für eine Reihe anderer angeblich integrierter Dienstprogramme ähnlich, die auch als externe Befehle verfügbar sind.
Zum Vergleich: in pdksh
( ksh
unter OpenBSD, woprintf
es kein eingebautes gibt):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
Und in bash
(wo printf
ist ein eingebautes):
$ command -v printf
printf
$ type printf
printf is a shell builtin
posix
printf
shell-builtin
yash
Kusalananda
quelle
quelle
PATH
muss, damit eine reguläre integrierte Funktion verwendet werden kann ausgeführt werden - dann stellen Sie bitte Ihre Frage dazu.Antworten:
Die
yash
Shell hat und benutzt eine eingebaute Version vonprintf
(und anderen Dienstprogrammen). Es ist einfach sehr pedantisch POSIX-konform, wie es das Ergebnis der Befehlecommand -v
und formulierttype
.Wie Mücken KommentareDer POSIX-Standard , dass ein regulärer integrierter Befehl als externer Befehl
$PATH
für die integrierte Version des Befehls verfügbar sein muss.Dies ist der relevante Text aus der Norm :
Dies bedeutet , dass der Ausgang des
command -v printf
bedeutet , dass derprintf
Befehl wurde im Suchpfad gefunden, während der Ausgang destype printf
dazu fügt hinzu , dass der Befehl ein reguläres ist eingebaut.Da der
printf
Befehl im Suchpfad gefunden wurde und regelmäßig in die Shell integriert ist,yash
wird die integrierte Version des Befehls aufgerufen . Wenn dasprintf
war nicht in dem Pfad, und wenn dieyash
Schale wurde in POSIX-ly korrekten Modus ausgeführt wird , wäre ein Fehler aufgetreten stattdessen erzeugt.yash
ist stolz darauf, eine sehr POSIX-konforme Shell zu sein, und dies gilt auch, wenn wir uns anschauen, was POSIX über Folgendes aussagtcommand -v
:quelle
Die Watanabe-Shell verfügt über drei Arten von integrierten Funktionen, die ausführlich in ihrem Handbuch beschrieben werden. Alle der integrierten Befehle auch dort aufgeführt sind, aber man hat , dass etwas eine „reguläre“ integrierten Befehl aus dem schließen Fehlen jeglicher Notiz, dass der Befehl ein „special“ oder ein „semi-special“ eingebaut. Normale Einbauten sind nicht markiert.
printf
ist eine solche "normale" eingebaut. Im einheitlichen Modus wird es immer aufgerufen, unabhängig davon, ob ein externer Befehl mit diesem Namen gefunden wurde.Wenn die
posixly-correct
Shell-Option aktiviert ist, ist sie nur dann integriert, wenn der externe Befehl auf der gefunden werden kannPATH
.Dies entspricht den Aussagen der Single Unix Specifiation und ist seit mindestens 1997 bekannt.
Es unterscheidet sich von der Z-Shell, der 93-Korn-Shell, der Bourne-Again-Shell und der Debian-Almquist-Shell, von denen keine ein solches Verhalten für reguläre Einbauten implementiert oder dokumentiert. Die Z-Shell zum Beispiel dokumentiert, dass reguläre eingebaute Funktionen immer vor dem Schritt gefunden werden, der durchsucht wird
PATH
. Dies gilt auch für die Debian-Almquist-Shell. Und genau das tun diese Shells, auch wenn siesh
mit ihren POSIX-Einschaltoptionen aufgerufen werden .Das Verhalten der PD-Korn-Shell, der Heirloom-Bourne-Shell und der MirBSD-Korn-Shell
printf
ist jedoch nicht aktiv, wenn sie nichtPATH
aktiviert ist. weil sie gar nicht erstprintf
eingebaut haben . ☺quelle
Der Wortlaut könnte verbessert werden.
Wenn sich die Shell im Posix-Modus befindet
set --posixly-correct
:Für reguläre Built-Ins, die im PATH nicht vorhanden sind, wird Folgendes gedruckt:
Was eine klare Beschreibung ist: Es ist eine eingebaute, aber es gibt keine ausführbare Datei mit demselben Namen im PATH.
Für reguläre Built-Ins, deren Name auch im PATH vorhanden ist, wird dies gedruckt:
Was bedeutet, dass die ausführbare Datei unter / bin / echo ausgeführt wird (was nicht der Fall sein wird). Ich schlage vor, dass ein Wechsel von
at
zualso found in PATH at
:würde eine bessere Beschreibung machen. Vielleicht könnte es besser sein, das in Klammern zu setzen (wie die andere Antwort es tat).
Im POSIX-Modus funktioniert kein reguläres Built-In, es sei denn, es befindet sich auch im PATH.
Beide (POSIX) -Spezial:
Und Yashs Semi-Special (nicht speziell für POSIX):
Builtins funktionieren immer noch.
quelle