Was bedeutet "-" (doppelter Bindestrich) in diesem Shell-Befehl?


12

Ich habe diesen Shell-Befehl:

kill `cat -- $PIDFILE`

Was macht das Doppelte hier? Warum nicht einfach verwenden

kill `cat $PIDFILE`

Antworten:


20

Die Anweisung lautet --, catnicht zu versuchen, das, was danach kommt, als Befehlszeilenoptionen zu analysieren.

Stellen Sie sich als Beispiel vor, was in beiden Fällen passieren würde, wenn die Variable $PIDFILEals definiert wäre PIDFILE="--version". Auf meinem Computer geben sie die folgenden Ergebnisse:

$ cat $PIDFILE
cat (GNU coreutils) 6.10
Copyright (C) 2008 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 Torbjorn Granlund and Richard M. Stallman.

$ cat -- $PIDFILE
cat: --version: No such file or directory

3
Es ist anzumerken, dass dieses Verhalten (obwohl sehr häufig) durch das empfangende Programm (dh cat) und nicht durch die Shell definiert wird.
dmckee --- Ex-Moderator Kätzchen

Gibt es eine Dokumentation oder ein Tutorial zum Schreiben eines eigenen Shell-Skripts, das --das Ende der Befehlszeilenoptionen versteht? Ich habe solche mit getopts und anderen Techniken gesehen, aber nichts diskutiert --.
CMCDragonkai

3
@CMCDragonkai Sie müssen nicht weiter als bis zur getopt(1)Manpage schauen : "Jeder Parameter nach einem '-' Parameter wird immer als Nichtoptionsparameter interpretiert".
Mikael Auno

1

POSIX.1-2017

POSIX gibt es auch an: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02

12.2 Richtlinien für die Utility-Syntax

Leitlinie 10:

Das erste - Argument , das keine Option-Argument ist , sollte als Trennzeichen akzeptiert werden , die das Ende der Optionen. Alle folgenden Argumente sollten als Operanden behandelt werden, auch wenn sie mit dem Zeichen "-" beginnen.

Siehe auch: /unix/11376/what-double-dash-mean-also-known-as-bare-double-dash

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.