[Erledigt] Was ist command -v?
[Erledigt] Was ist command -v?
Ich beziehe mich auf diesen Artikel, der über das which Kommando und dessen Alternative command -v berichtet.
Das Letztere funktioniert auch.
Aber es gibt keine manpage dazu, kein -h und scheinbar nicht mal ein binary in irgendeinem bin-folder.
Auch which command findet nichts. command -v command ist auch nicht sehr hilfreich.
Also was ist das für eine Zauberei? Ist das in der bash-shell eingebaut?
Nebenbefund, der damit wahrscheinlich nichts zu tun hat: Wenn man das -v weglässt und z.B. command apt erhält man einen langen Text und am Ende steht "Dieses APT hat Super-Kuh-Kräfte."
Das Letztere funktioniert auch.
Aber es gibt keine manpage dazu, kein -h und scheinbar nicht mal ein binary in irgendeinem bin-folder.
Auch which command findet nichts. command -v command ist auch nicht sehr hilfreich.
Also was ist das für eine Zauberei? Ist das in der bash-shell eingebaut?
Nebenbefund, der damit wahrscheinlich nichts zu tun hat: Wenn man das -v weglässt und z.B. command apt erhält man einen langen Text und am Ende steht "Dieses APT hat Super-Kuh-Kräfte."
Zuletzt geändert von buhtz am 01.11.2021 09:21:10, insgesamt 1-mal geändert.
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (backintime)
Teil des Upstream Betreuer Teams von Back In Time (backintime)
Re: Was ist command -v?
Code: Alles auswählen
niemand@NUC ~ % whatis command
command (1p) - execute a simple command
niemand@NUC ~ % which command
command: shell built-in command
niemand@NUC ~ % man command
COMMAND(1P) POSIX Programmer's Manual COMMAND(1P)
PROLOG
This manual page is part of the POSIX Programmer's Manual. The
Linux implementation of this interface may differ (consult the cor‐
responding Linux manual page for details of Linux behavior), or the
interface may not be implemented on Linux.
NAME
command — execute a simple command
SYNOPSIS
command [-p] command_name [argument...]
command [-p][-v|-V] command_name
DESCRIPTION
The command utility shall cause the shell to treat the arguments as
a simple command, suppressing the shell function lookup that is de‐
scribed in Section 2.9.1.1, Command Search and Execution, item 1b.
If the command_name is the same as the name of one of the special
built-in utilities, the special properties in the enumerated list
at the beginning of Section 2.14, Special Built-In Utilities shall
not occur. In every other respect, if command_name is not the name
of a function, the effect of command (with no options) shall be the
same as omitting command.
When the -v or -V option is used, the command utility shall provide
information concerning how a command name is interpreted by the
shell.
[…]
Re: Was ist command -v?
Was genau ist deine Frage, buhtz?
Ich nutze `which' (meist als `which -a`) interaktiv in der Shell. Sollen meine Shellscripte pruefen, ob ein Befehl vorhanden ist, dann nutze ich `command -v' weil ich darin den portabelsten und verlaesslichsten Weg sehe. Aus meiner Sicht geht es nicht um entweder-oder, sondern um je-nachdem. Die Entscheidung des TC, wie im verlinkten Artikel erwaehnt, finde ich gut.
Ich nutze `which' (meist als `which -a`) interaktiv in der Shell. Sollen meine Shellscripte pruefen, ob ein Befehl vorhanden ist, dann nutze ich `command -v' weil ich darin den portabelsten und verlaesslichsten Weg sehe. Aus meiner Sicht geht es nicht um entweder-oder, sondern um je-nachdem. Die Entscheidung des TC, wie im verlinkten Artikel erwaehnt, finde ich gut.
Use ed once in a while!
Re: Was ist command -v?
Ich sitze hier noch vor einem buster und da gibt's tatsächlich keine manpage:
$ type command
command is a shell builtin
$ man command
No manual entry for command
@buhtz: Sofern die manpage fehlt, wirst du bei man bash fündig.
¹edit:
@niemand hat vermutlich manpages-posix installiert und bekommt deswegen eine manpage angezeigt.
$ type command
command is a shell builtin
$ man command
No manual entry for command
@buhtz: Sofern die manpage fehlt, wirst du bei man bash fündig.
¹edit:
@niemand hat vermutlich manpages-posix installiert und bekommt deswegen eine manpage angezeigt.
Zuletzt geändert von Tintom am 31.10.2021 07:57:09, insgesamt 1-mal geändert.
Grund: ¹ hinzugefügt
Grund: ¹ hinzugefügt
Re: Was ist command -v?
Ja, in der Manpage steht auch ``COMMAND(1P)'', das ist also die Manpage fuer ``command'' in der Section ``1p'' -- 1 sind die User-Commands und der Zusatz ``p'' wird fuer POSIX-Manpages verwendet.Tintom hat geschrieben:31.10.2021 07:52:45¹edit:
@niemand hat vermutlich manpages-posix installiert und bekommt deswegen eine manpage angezeigt.
Use ed once in a while!
Re: Was ist command -v?
@Meillo: Danke für die Erläuterung.
Jetzt stellt sich mir aber als nächstes die Frage: Weicht die Implementierung von command in der Bash von POSIX ab oder warum braucht es eine eigene manpage dafür?
Jetzt stellt sich mir aber als nächstes die Frage: Weicht die Implementierung von command in der Bash von POSIX ab oder warum braucht es eine eigene manpage dafür?
Re: Was ist command -v?
Sie sind nuetzlich, wenn man wissen will, welche Switches und welches Verhalten von POSIX spezifiziert sind.Tintom hat geschrieben:31.10.2021 08:17:27Jetzt stellt sich mir aber als nächstes die Frage: Weicht die Implementierung von command in der Bash von POSIX ab oder warum braucht es eine eigene manpage dafür?
Jeder Befehl ist in POSIX separat beschrieben und hat folglich auch ein Manpage, auch Befehle wie `cd' und `bg', die von der Shell selbst (mittels eines Shell-Builtins) realisiert werden muessen.
Oft weichen reale Implementierungen von POSIX ab. Da POSIX urspruenglich nur den gemeinsamen Nenner dokumentiert hat, war es immer nur als Subset der realen Features gedacht. Nur an wenigen Stellen (wie z.B. `tail -n', `sort -k') hat POSIX selbst Features hinzugefuegt, oder neu angelegt, um Stimmigkeit zu schaffen. (Das betrifft zumeist Optionen, die mittels `+' eingeleitet worden sind. So ist aus `tail +10' dann `tail -n 10' geworden.)
Fuer Normalanwender sind die POSIX-Manpages nicht wichtig, zumal sie verstehen muessen, dass POSIX-Manpages nicht den bei ihnen vorhandenen Befehl beschreiben, sondern eine Dokumentation des Standards sind!
(Doof fuer Anwender ist nebenbei, dass manche Befehle eine eigene Manpage haben und manche aber in der Manpage der Shell nachgelesen werden muessen (wie `command') ... und manche, die eine eigene Manpage haben, werden gar nicht verwendet, weil es ein gleichnamiges Builtin gibt, das ggf. andere Features hat (wie `printf').)
Use ed once in a while!
Re: Was ist command -v?
In diesem Fall beantwortet’s aber die Fragen des TO: „Was ist es, wozu ist es gut und was macht die Option -v?“Meillo hat geschrieben:31.10.2021 08:34:17Fuer Normalanwender sind die POSIX-Manpages nicht wichtig, zumal sie verstehen muessen, dass POSIX-Manpages nicht den bei ihnen vorhandenen Befehl beschreiben, sondern eine Dokumentation des Standards sind!
… und um‘s bei Bedarf doch zu verwenden, gibt es command[…] und manche, die eine eigene Manpage haben, werden gar nicht verwendet, weil es ein gleichnamiges Builtin gibt, das ggf. andere Features hat (wie `printf').)
Re: Was ist command -v?
Unter der Einschraenkung, dass die real vorhandene Implementierung bei ihm etwas anderes tun koennte als das was in der POSIX-Manpage beschrieben ist.niemand hat geschrieben:31.10.2021 08:38:18In diesem Fall beantwortet’s aber die Fragen des TO: „Was ist es, wozu ist es gut und was macht die Option -v?“Meillo hat geschrieben:31.10.2021 08:34:17Fuer Normalanwender sind die POSIX-Manpages nicht wichtig, zumal sie verstehen muessen, dass POSIX-Manpages nicht den bei ihnen vorhandenen Befehl beschreiben, sondern eine Dokumentation des Standards sind!
(Unter FreeBSD gibt es fuer alle Builtins aliase auf die Manpage builtin(1): https://www.freebsd.org/cgi/man.cgi?que ... ease-ports
Das finde ich sinnvoll.
Wie meinst du das?… und um‘s bei Bedarf doch zu verwenden, gibt es command[…] und manche, die eine eigene Manpage haben, werden gar nicht verwendet, weil es ein gleichnamiges Builtin gibt, das ggf. andere Features hat (wie `printf').)
`command printf' ruft nichts desto trotz das Builtin auf ... nur keine ggf. vorhandene Shellfunktion mit gleichem Namen.
Use ed once in a while!
Re: Was ist command -v?
Ich habe den Auszug der Manpage unter der Annahme gepostet, dass der TE eine der verbreiteteren Shells verwendet, welche command entsprechend der POSIX-Vorgabe implementieren. Ich halte diese Annahme weiterhin für vertretbar. (siehe Anmerkung unten)Meillo hat geschrieben:31.10.2021 09:10:45Unter der Einschraenkung, dass die real vorhandene Implementierung bei ihm etwas anderes tun koennte als das was in der POSIX-Manpage beschrieben ist.
Zumindest bei mir funktioniert es, wie es in der Manpage gefordert wird („The command utility shall cause the shell to treat the arguments as a simple command, suppressing the shell function lookup that is described in Section 2.9.1.1“):
Code: Alles auswählen
niemand@NUC ~ % command -V echo
echo is a shell builtin
niemand@NUC ~ % echo --help
--help
niemand@NUC ~ % /bin/echo --help
Aufruf: /bin/echo [KURZOPTION]... [ZEICHENKETTE]...
oder: /bin/echo LANGOPTION
[…]
niemand@NUC ~ % command echo --help
Aufruf: echo [KURZOPTION]... [ZEICHENKETTE]...
oder: echo LANGOPTION
[…]
Edit: ich sehe gerade, dass die Bash command tatsächlich nicht entsprechend der Doku implementiert hat. Hätte ich nun nicht gedacht, dass solche einfachen Sachen da nicht umgesetzt wurden …
--
OT: „nichtsdestotrotz“
Re: Was ist command -v?
Das ist nicht unueblich, wie die Erfahrung zeigt.niemand hat geschrieben:31.10.2021 09:31:17Edit: ich sehe gerade, dass die Bash command tatsächlich nicht entsprechend der Doku implementiert hat. Hätte ich nun nicht gedacht, dass solche einfachen Sachen da nicht umgesetzt wurden …
Den Unterschied zwischen `command -v' und `which' sehe ich darin, dass `command -v' nur schaut, ob ein Befehl diesen Namens vorhanden ist, egal ob als Builtin oder als Executable. `which' dagegen gibt den Pfad der Executable aus. Wenn ich sicher das Executable ausfuehren will, wuerde ich es so machen:
Code: Alles auswählen
`which printf` ...
Use ed once in a while!
Re: Was ist command -v?
FTFY – in anderen Shells funktioniert es sehr wohl, wie der geneigte Leser meinem obenstehenden Beispiel entnehmen kann.Meillo hat geschrieben:31.10.2021 11:06:29Diesbezueglich hilft das `command' der Bash nicht weiter, weil es Builtins gleichwertig wie Executables behandelt.
Re: Was ist command -v?
Mein ``diesbezueglich'' bezog sich auf den Absatz davor, indem ich beschrieben habe, dass `command' Executables und Builtins in einen Topf wirft und zwischen ihnen nicht unterscheidet. `which' betrachtet aber nur Executables. `command' hilft also nicht, wenn man unbedingt das Executable ausfuehren will, nicht aber das Builtin. `command' hilft dann wenn man Executable oder Builtin ausfuehren will, bloss keine Shellfunktion.
Dies scheint mir der entscheidende Satz zu sein, wenn man `command' ohne Switches aufruft:
Wie man nachfolgend sowohl in der mksh als auch in der bash sehen kann fuehrt `command printf' das Builtin aus, nicht aber /usr/bin/printf. Shellfunktionen und Aliase werden ignoriert.
@niemand: Welche Version der bash hast du denn? Denn das Verhalten der bash weicht bei uns ab:
Bei mir ruft `command echo' das Builtin auf, bei dir aber /bin/echo. Das Verhalten bei mir entspricht POSIX (soweit ich das beurteilen kann).
Nun zu `command -v' bzw. `command -V'.
In der Bash (im Anschluss zu obiger Session):
Und in der mksh (im Anschluss zu obiger Session):
Beide Shells verhalten sich hier POSIX-konform. `command -v' bzw. `command -V' prueft nur, ob es einen Befehl (egal ob Alias, Funktion, Builtin oder Executable) mit diesem Namen gibt.
(`which' dagegen schaut welchen Pfad das Executable mit diesem Namen hat. Es ignoriert Aliase, Funktionen und Builtins komplett. ... allerdings ist `which' nicht Teil von POSIX und darum vermutlich weniger portabel.)
Dies scheint mir der entscheidende Satz zu sein, wenn man `command' ohne Switches aufruft:
`command' ignoriert also nur Shell-Funktionen.https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html hat geschrieben: In every other respect, if command_name is not the name of a function, the effect of command (with no options) shall be the same as omitting command.
Wie man nachfolgend sowohl in der mksh als auch in der bash sehen kann fuehrt `command printf' das Builtin aus, nicht aber /usr/bin/printf. Shellfunktionen und Aliase werden ignoriert.
Code: Alles auswählen
:-Q echo $KSH_VERSION
@(#)MIRBSD KSH R40 2012/07/20 Debian-7
:-Q type printf
printf is a shell builtin
:-Q printf %p
printf: %p: invalid directive
:-Q /usr/bin/printf %p
/usr/bin/printf: %p: invalid conversion specification
:-Q printf() { echo function; }
:-Q printf %p
function
:-Q alias printf='echo alias'
:-Q printf
alias
:-Q command printf %p
printf: %p: invalid directive
Code: Alles auswählen
meillo@quagga:~$ echo $BASH_VERSION
4.2.37(1)-release
meillo@quagga:~$ printf %p
bash: printf: `p': invalid format character
meillo@quagga:~$ /usr/bin/printf %p
/usr/bin/printf: %p: invalid conversion specification
meillo@quagga:~$ printf() { echo function; }
meillo@quagga:~$ printf %p
function
meillo@quagga:~$ alias printf='echo alias'
meillo@quagga:~$ printf %p
alias %p
meillo@quagga:~$ command printf %p
bash: printf: `p': invalid format character
@niemand: Welche Version der bash hast du denn? Denn das Verhalten der bash weicht bei uns ab:
Bei mir:niemand hat geschrieben:31.10.2021 09:31:17Code: Alles auswählen
niemand@NUC ~ % command -V echo echo is a shell builtin niemand@NUC ~ % echo --help --help niemand@NUC ~ % /bin/echo --help Aufruf: /bin/echo [KURZOPTION]... [ZEICHENKETTE]... oder: /bin/echo LANGOPTION […] niemand@NUC ~ % command echo --help Aufruf: echo [KURZOPTION]... [ZEICHENKETTE]... oder: echo LANGOPTION […]
Code: Alles auswählen
:-Q bash
meillo@quagga:~$ echo --help
--help
meillo@quagga:~$ echo --version
--version
meillo@quagga:~$ /bin/echo --version
echo (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Brian Fox and Chet Ramey.
meillo@quagga:~$ command echo --version
--version
meillo@quagga:~$
Nun zu `command -v' bzw. `command -V'.
In der Bash (im Anschluss zu obiger Session):
Code: Alles auswählen
meillo@quagga:~$ command -v printf
alias printf='echo alias'
meillo@quagga:~$ command -V printf
printf is aliased to `echo alias'
meillo@quagga:~$ unalias printf
meillo@quagga:~$ command -v printf
printf
meillo@quagga:~$ command -V printf
printf is a function
printf ()
{
echo function
}
meillo@quagga:~$ unset printf
meillo@quagga:~$ type printf
printf is a shell builtin
meillo@quagga:~$ command -v printf
printf
meillo@quagga:~$ command -V printf
printf is a shell builtin
Code: Alles auswählen
:-Q command -v printf
alias printf='echo alias'
:-Q command -V printf
printf is an alias for 'echo alias'
:-Q unalias printf
:-Q command -v printf
printf
:-Q command -V printf
printf is a function
:-Q unset -f printf
:-Q command -v printf
printf
:-Q command -V printf
printf is a shell builtin
(`which' dagegen schaut welchen Pfad das Executable mit diesem Namen hat. Es ignoriert Aliase, Funktionen und Builtins komplett. ... allerdings ist `which' nicht Teil von POSIX und darum vermutlich weniger portabel.)
Use ed once in a while!
Re: Was ist command -v?
zsh, und dass das Verhalten abweicht, wollte ich mit der vorhergehenden Antwort nochmal zum Ausdruck gebracht haben: dort sorgt command dafür, dass der entsprechende Befehl verwendet wird, nicht die Shellfunktion – gerade, wie ich es aus „The command utility shall cause the shell to treat the arguments as a simple command, suppressing the shell function lookup […]“ herauslesen würde.Meillo hat geschrieben:31.10.2021 14:59:16Welche Version der bash hast du denn? Denn das Verhalten der bash weicht bei uns ab
Re: Was ist command -v?
Aus meiner Sicht verhalten sich bash und mksh POSIX-konform, die zsh aber nicht.niemand hat geschrieben:31.10.2021 15:08:34zsh, und dass das Verhalten abweicht, wollte ich mit der vorhergehenden Antwort nochmal zum Ausdruck gebracht haben: dort sorgt command dafür, dass der entsprechende Befehl verwendet wird, nicht die Shellfunktion – gerade, wie ich es aus „The command utility shall cause the shell to treat the arguments as a simple command, suppressing the shell function lookup […]“ herauslesen würde.Meillo hat geschrieben:31.10.2021 14:59:16Welche Version der bash hast du denn? Denn das Verhalten der bash weicht bei uns ab
`command echo' soll eine ggf. vorhandene Funktion mit Namen `echo' ueberspringen, ein Builtin aber beruecksichtigen, denn: ``In every other respect, if command_name is not the name of a function, the effect of command (with no options) shall be the same as omitting command.'' Deine zsh macht das nicht Bei ihr bekommt du unterschiedliche Ergebnisse wenn du (in Abwesenheit einer Funktion namens `echo') die folgenden zwei Zeilen aufrufst:
Code: Alles auswählen
echo --version
command echo --version
Use ed once in a while!
Re: Was ist command -v?
Und aus meiner Sicht verhält es sich andersherum: command soll die Shell veranlassen, den Befehl auszuführen, statt die eigene Funktion dafür auszuführen („shall cause the shell to treat the arguments as a simple command, suppressing the shell function lookup“), wobei ich die Builtins als Funktion der Shell sehen würde, wie’s auch in der deutschen Ausgabe von type zu lesen ist.Meillo hat geschrieben:31.10.2021 15:42:15Aus meiner Sicht verhalten sich bash und mksh POSIX-konform, die zsh aber nicht.
Klarheit mag ein Blick in „Section 2.9.1.1, Command Search and Execution“ und „Section 2.14, Special Built-In Utilities” bringen, auf die in der Manpage verwiesen wird. Allerdings habe ich da noch kein kompaktes (im Sinne von „zusammenhängendes“) Dokument gefunden.
Re: Was ist command -v?
Egal ist was du denkst. Du musst die Beschreibungen in POSIX lesen, dann findest du raus wie es sein sollte. Aber ja, POSIX ist sehr strukturiert aufgebaut, d.h. Dinge werden nicht mehrfach wiederholt, sondern an der passenden Stelle beschrieben und dann darauf verwiesen. Wenn man damit noch wenig Kontakt hatte, muss man sich erst ein bisschen zurecht finden.niemand hat geschrieben:31.10.2021 15:51:37wobei ich die Builtins als Funktion der Shell sehen würde
Use ed once in a while!
Re: Was ist command -v?
Gut, da mag mir noch ’n bisschen Wissen über die dort verwendete Terminologie, sowie über einige Zusammenhänge fehlen.Meillo hat geschrieben:31.10.2021 15:55:25Egal ist was du denkst. Du musst die Beschreibungen in POSIX lesen, dann findest du raus wie es sein sollte.
Allerdings ist das Verhalten von zsh da tatsächlich dokumentiert, und lässt sich auf „POSIX-konform“ umbiegen:
ZSH-Handbuch hat geschrieben:Code: Alles auswählen
command [ -pvV ] The command word is taken to be the name of an external command, rather than a shell function or builtin. If the POSIX_BUILTINS option is set, builtins will also be executed but certain special properties of them are suppressed. The -p flag causes a default path to be searched instead of that in $path. With the -v flag, command is similar to whence and with -V, it is equivalent to whence -v.
Re: Was ist command -v?
Danke fuer diese Info. Schoen, dass das dokumentiert ist.niemand hat geschrieben:31.10.2021 16:30:09Allerdings ist das Verhalten von zsh da tatsächlich dokumentiert, und lässt sich auf „POSIX-konform“ umbiegen:ZSH-Handbuch hat geschrieben:Code: Alles auswählen
command [ -pvV ] The command word is taken to be the name of an external command, rather than a shell function or builtin. If the POSIX_BUILTINS option is set, builtins will also be executed but certain special properties of them are suppressed. The -p flag causes a default path to be searched instead of that in $path. With the -v flag, command is similar to whence and with -V, it is equivalent to whence -v.
Use ed once in a while!
Re: Was ist command -v?
Danke an alle zusammen.
Ich denke, ich habs kapiert.
Ich denke, ich habs kapiert.
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (backintime)
Teil des Upstream Betreuer Teams von Back In Time (backintime)