Variationen der Linux-Befehlszeilenargumente

Variationen der Linux-Befehlszeilenargumente

Ich bin neu bei Linux und habe ein paar Fragen zu Befehlszeilenargumenten:

Nehmen wir an, es gibt ein Befehlszeilentool namens , widgetdas ein Argument namens akzeptiert fizz. Ich habe alle möglichen Arten von Argumenten gesehen:

widget -fizz
widget --fizz
widget \fizz
widget -f

Worin besteht der Unterschied in der Verwendung dieser Zeichen? Entscheidet das Befehlszeilentool, wie sie anders bestimmt werden, oder weiß Linux, dass sie alle dasselbe bedeuten, gibt sie aber unterschiedlich an die Anwendung weiter?

Könnte ich meine eigene Methode anpassen, um dem (bereits vorhandenen) widgetTool sein fizzArgument zu übergeben:

widget #f#

Dank im Voraus!

Antwort1

Was ist der Unterschied in der Verwendung?

Das hängt ganz vom Programm ab, denn...

Entscheidet das Befehlszeilentool auf unterschiedliche Weise, wie sie bestimmt werden, oder weiß Linux, dass sie alle dasselbe bedeuten, gibt sie aber auf unterschiedliche Weise an die Anwendung weiter?

...die Argumente für den Prozess kommen als Array einzelner Zeichenfolgen.

Hier sind zwei Dinge beteiligt: ​​Zum einen die Shell, die die von Ihnen eingegebenen Eingaben analysiert und den Prozess ausführt. Sie trennt beispielsweise die Zeichenfolge bei Leerzeichen und übergibt diese an . Weitere Informationen zur Handhabung dieser Dinge widgetfinden Sie beispielsweise unter und .man shman bash

Letztendlich erhält jedoch widgetdas Argument -fizzgenau --fizzso, wie es geschrieben ist, als Zeichenfolge. Es entscheidet, was damit geschehen soll.

Es gibt einige Standards – viele Varianten von getoptsund , poptdie diese Argumente für verarbeiten widget, und sie weisen ein gewisses Maß an „Standard“-Verhalten auf.

Nichts hindert den Autor widgetjedoch daran, einen eigenen Standard zu erfinden.

Wenn Sie also der Autor des widgetQuellcodes sind oder ihn anderweitig ändern, können Sie ihn durchaus #f#als fizzArgument behandeln lassen. Dies ist allerdings nicht möglich, ohne das Programm zu ändern.

Antwort2

Entscheidet das Befehlszeilentool auf unterschiedliche Weise, wie sie bestimmt werden, oder weiß Linux, dass sie alle dasselbe bedeuten, gibt sie aber auf unterschiedliche Weise an die Anwendung weiter?

Es ist die Aufgabe des ausführbaren Objekts oder der Funktion, seine Argumente auszuwerten. Die Shell (nicht Linux, sondern bash, csh, usw.) greift bei diesen Argumenten überhaupt nicht ein.

Das bedeutet, dass jedes Argument in Ihrem Fall anders behandelt wird. Beachten Sie jedoch, dass die ShellErweiterungenoderSubstitutionenbevor der Befehl seine Argumente erhält. Wenn Sie beispielsweise einen Ordner mit zwei JPG-Bildern haben und schreiben:

ls *.jpg

Anschließend wird die Shell *.jpgzu erweitert image1.jpg image2.jpg, wodurch lsdie folgenden Argumente übergeben werden:

ls image1.jpg image2.jpg

Abgesehen davon können Sie ein Skript nicht wirklich so ändern, dass es ein anderes Argument annimmt als das, was bereits kompiliert oder in die ausführbare Datei geschrieben wurde, außer Sie müssen den Quellcode neu schreiben.

Schauen Sie sich auch die folgende Frage an:

Was ist der Unterschied zwischen einem und zwei Bindestrichen bei Eingabeaufforderungsparametern?

Antwort3

Zunächst einmal ist es unwahrscheinlich, dass Sie \in Linux ein Argument sehen, das mit beginnt, weil dies in den meisten Shells ein Escape-Zeichen ist, das zum Escapen von Leerzeichen und anderen Zeichen verwendet wird, die für die Shell eine Bedeutung haben ( $, "", (), usw.).

Die Linux-Shell (in den meisten Distributionen Bash) übergibt lediglich jedes durch Leerzeichen getrennte Argument als Zeichenfolge an den Prozess. Was der Prozess damit macht, bleibt dem Programmierer überlassen.

Normalerweise -gibt das Präfix eine kurze Option an (wie -h) und das --eine längere Version (wie --help). Dies ist Teil des POSIX-Standards, den die meisten Linux-Programme verwenden und der von frühen Unix-Tools übernommen wurde. Siehe diegetoptWeitere Informationen finden Sie im Wikipedia-Artikel.

Zu Ihrer letzten Frage: Nein, Sie können die Art und Weise, wie das widgetTool diese Argumente interpretiert, nicht ändern, es sei denn, Sie ändern den Quellcode.

Auf einigen Unix-Systemen gibt es ein praktisches Dienstprogramm namenspargsDamit können Sie alle Argumente sehen, die an den Prozess übergeben wurden. Unter Linux können Sie dies replizieren mit

ps eww -p 12345

Wobei 12345 die Prozesskennung (PID) ist. Siehediese Antwortfür eine Alternative.

verwandte Informationen