Ich bin neu bei Linux und habe ein paar Fragen zu Befehlszeilenargumenten:
Nehmen wir an, es gibt ein Befehlszeilentool namens , widget
das 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) widget
Tool sein fizz
Argument 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 widget
finden Sie beispielsweise unter und .man sh
man bash
Letztendlich erhält jedoch widget
das Argument -fizz
genau --fizz
so, wie es geschrieben ist, als Zeichenfolge. Es entscheidet, was damit geschehen soll.
Es gibt einige Standards – viele Varianten von getopts
und , popt
die diese Argumente für verarbeiten widget
, und sie weisen ein gewisses Maß an „Standard“-Verhalten auf.
Nichts hindert den Autor widget
jedoch daran, einen eigenen Standard zu erfinden.
Wenn Sie also der Autor des widget
Quellcodes sind oder ihn anderweitig ändern, können Sie ihn durchaus #f#
als fizz
Argument 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 *.jpg
zu erweitert image1.jpg image2.jpg
, wodurch ls
die 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 widget
Tool 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.