Welches ist das Standardpaket, getopt oder getopts (mit einem "s")?

7

Die Linux Foundation- Liste der Standarddienstprogramme enthält, getoptsjedoch nicht getopt. Ähnliches gilt für die Open Group- Liste der Posix-Dienstprogramme.

Inzwischen Wikipedias Liste von Standard - Unix - Befehle enthält getoptaber nicht getopts. In ähnlicher Weise enthält das Windows-Subsystem für Linux (basierend auf Ubuntu basierend auf Debian) auch, getoptaber nicht getopts(und es ist die GNU Enhanced-Version ).

balter@spectre:~$ which getopt
/usr/bin/getopt
balter@spectre:~$ getopt -V
getopt from util-linux 2.27.1
balter@spectre:~$ which getopts
balter@spectre:~$ 

Wenn ich also eine auswählen möchte, bei der ich am sichersten sein kann, dass jemand eine der Standard-Linux-Distributionen verwendet (z. B. Debian, Red Hat, Ubuntu, Fedora, CentOS usw.), welche sollte ich auswählen?

Hinweis:

Vielen Dank an Michael und Muru für die Erklärung von Builtin vs Executable. Ich hatte gerade über stolperte dies auch , welche Listen builtins bash.

abalter
quelle
5
getoptsist eine integrierte Shell (wie beide Quellen identifizieren), keine ausführbare Datei. Es ist in jeder POSIX-Shell enthalten, einschließlich der von WSL Ubuntu. Was versuchst du eigentlich damit zu machen? Es ist nicht unmöglich, dass es Fälle gibt, in denen es darauf ankommt, was Sie verwenden, aber es gibt hier nicht genügend Informationen, um dies zu sagen.
Michael Homer
Wenn Sie eines getoptoder getopts überhaupt verwenden möchten, ist dies ein Warnsignal dafür, dass Ihr Shell-Skript wahrscheinlich so kompliziert ist, dass Sie es in eine bessere Programmiersprache umschreiben sollten, z. B. Perl, Python, Ruby oder sogar PHP.
zwol
@zwol - Ich könnte es zurückwerfen und sagen, dass Ihre Aussage anzeigt, dass Sie kein erfahrener Bash-Programmierer sind;) Ich arbeite in einem Bereich, in dem wir andere Befehlszeilenprogramme weiterleiten und die Pipelines in einem Cluster ausführen. Die Verwendung eines Bash-Skripts ist bei weitem die effizienteste Methode. Ich hatte großen Erfolg mit der Verwendung von getopts in dieser Anwendung. Ich benutze Python, wenn es das bessere Werkzeug ist.
Abalter

Antworten:

14

whichist das falsche Werkzeug. getoptsist in der Regel auch ein eingebautes :

Da sich dies getoptsauf die aktuelle Shell-Ausführungsumgebung auswirkt, wird sie im Allgemeinen als reguläre integrierte Shell bereitgestellt.

~ for sh in dash ksh bash zsh; do "$sh" -c 'printf "%s in %s\n" "$(type getopts)" "$0"'; done
getopts is a shell builtin in dash
getopts is a shell builtin in ksh
getopts is a shell builtin in bash
getopts is a shell builtin in zsh

Wenn Sie ein Shell-Skript verwenden, können Sie sich sicher darauf verlassen getopts. Es mag andere Gründe geben , den einen oder anderen zu bevorzugen, aber dies getoptsist Standard .

Siehe auch: Warum nicht "welche" verwenden? Was ist dann zu verwenden?

muru
quelle
1
getoptwurde vor einiger Zeit zugunsten von fallen gelassen getopts. Das neue GNU-Enhanced getoptscheint sich jedoch verbessert zu haben getopts. Aber wenn getoptses der Posix-Standard ist, sollte ich mich vorerst daran halten.
Abalter
3

Ich würde auch lieber getoptsüber getoptden folgenden Gründen:

getopt Nachteile

  1. Externes Dienstprogramm
  2. In der herkömmlichen Version können leere Argumentzeichenfolgen oder Argumente mit eingebettetem Leerzeichen nicht verarbeitet werden

getopts Vorteile

  1. Funktioniert in jeder POSIX-Shell und ist portabel
  2. Funktioniert gut mit -a -bsowie-ab
Arushix
quelle
Sehr deutlich. Vielen Dank! Besonders die Informationen über-a -b === -ab
Abalter