Das ist ein Marker für SCCS Versionsinformationen, die das what
Programm sucht. Es berichtet, was bis zu einem aus einer Anzahl von Endmarkierungen folgt: Nullbyte, Zeilenumbruch, Doppelzitat "
, größer als >
und Backslash \
.
Was ist SCCS? Es steht für Source Code Control System und wurde von Marc J Rochkind bei AT & T (Bell Labs) für Unix entwickelt. Es war der erste weit verbreitete Unix-basierte VCS (Version Control System) und wird in POSIX mit den Befehlen admin
, delta
, get
, prs
, rmdel
, unget
und what
standardisiert. Die klassische (AT & T) Version enthalten Befehle cdc
, comb
, help
(ja, es diesen Namen vorbelegt, es ist manchmal sccshelp
in diesen Tagen genannt), sact
, sccsdiff
und val
auch. Einige Systeme haben ein Programm sccs
bereitgestellt, das wie cvs
oder git
einen Befehlsnamen als erstes Argument verwendet. SCCS wurde geschlossen Quelle. Die Open-Source-Community verwendete erste RCS und später CVS statt, und später gibt es eine Fülle von anderen Alternativen, wie Git, Subversion, Mercurial, Fossil, Bazaar, ... Sie mindestens zwei Open-Source-Versionen von SCCS finden: Schily-SCCS und CSSC (eine GNU-Reimplementierung von SCCS), die beide weitgehend kompatibel mit SCCS sind. SCCS ist ein zentralisiertes VCS, wie RCS und viele andere Systeme, im Gegensatz zu verteilten VCS (DVCS) wie Git. Es wird erwartet, dass eine Master-Version der SCCS-verwalteten Dateien irgendwo gespeichert wird.
Warum @(#)
anstelle von INFO
oder andere Notationen, der Grund war genau, um jede plausible Verwechslung mit normalem Text zu vermeiden. Es ist sehr unwahrscheinlich, dass Sie jemals einen Grund haben, diese Zeichensequenz anders als als SCCS-Marker zu schreiben.
Ich benutze es vor RCS $Id$
Strings (die separat von ident
aus dem RCS-Paket verfolgt werden können). So zum Beispiel, mein rmk
Programm ergibt:
$ what rmk
rmk:
RMK Version 25.92 (2017-10-09)
*** SCCS enabled ***
*** RCS enabled ***
$Id: getopt.h,v 2015.3 2015/09/29 07:13:26 jleffler Exp $
$Id: stderr.h,v 10.12 2017/04/08 03:43:34 jleffler Exp $
$Id: sastrings.h,v 2.16 2015/07/05 06:52:05 jleffler Exp $
$Id: list.h,v 9.6 2016/03/06 18:09:00 jleffler Exp $
$Id: emalloc.h,v 5.10 2015/02/17 04:50:35 jleffler Exp $
$Id: debug.h,v 3.13 2016/01/17 15:47:27 jleffler Exp $
$Id: kludge.h,v 1.16 2016/01/17 15:48:53 jleffler Exp $
$Id: config.h,v 9.14 2016/09/05 05:37:55 jleffler Exp $
$Id: make.h,v 9.20 2017/03/28 21:03:36 jleffler Exp $
$Id: main.c,v 9.20 2016/08/30 22:38:57 jleffler Exp $
$Id: basename.c,v 2.4 2008/02/11 08:44:50 jleffler Exp $
$Id: check.c,v 9.6 2016/03/06 07:36:35 jleffler Exp $
$Id: cleanup.c,v 9.6 2016/08/30 22:38:57 jleffler Exp $
*** DEBUGGING ENABLED ***
$Id: debug.c,v 3.12 2016/07/13 00:00:35 jleffler Exp $
$Id: emalloc.c,v 5.13 2016/01/17 16:05:58 jleffler Exp $
$Id: errhelp.c,v 8.5 2009/03/02 19:13:51 jleffler Exp $
$Id: estrdup.c,v 5.7 2015/06/02 03:05:40 jleffler Exp $
$Id: getopt.c,v 2015.2 2015/09/29 07:13:58 jleffler Exp $
$Id: input.c,v 9.24 2017/10/09 20:34:18 jleffler Exp $
$Id: list.c,v 9.4 2015/07/16 00:13:23 jleffler Exp $
$Id: macro.c,v 9.15 2016/08/30 22:38:57 jleffler Exp $
$Id: make.c,v 9.12 2017/03/28 21:03:36 jleffler Exp $
$Id: names.c,v 9.12 2016/08/30 22:38:57 jleffler Exp $
$Id: rcs.c,v 9.9 2016/08/30 22:38:57 jleffler Exp $
$Id: rcsfile.c,v 9.9 2016/08/30 22:38:57 jleffler Exp $
$Id: rules.c,v 9.9 2016/03/06 03:58:52 jleffler Exp $
$Id: sastrings.c,v 2.22 2015/07/05 06:52:05 jleffler Exp $
$Id: sccs.c,v 9.11 2016/08/30 22:38:57 jleffler Exp $
$Id: sccsfile.c,v 9.8 2016/08/30 22:38:57 jleffler Exp $
$Id: stderr.c,v 10.19 2017/07/10 04:54:26 jleffler Exp $
$Id: touch.c,v 9.7 2016/03/06 17:31:17 jleffler Exp $
$Id: vstrcpy.c,v 1.13 2008/02/11 08:44:50 jleffler Exp $
$Id: archive.c,v 9.11 2017/06/04 04:44:17 jleffler Exp $
$Id: clnpath.c,v 2.19 2017/03/26 06:32:49 jleffler Exp $
$Id: dirname.c,v 2.6 2012/02/06 01:55:16 jleffler Exp $
$Id: tokenise.c,v 2.2 2017/03/26 06:33:37 jleffler Exp $
$
Es erlaubt mir, um zu sehen, welche Versionen von denen Dateien verwendet werden, um das Programm zu bauen, sowie einige Hilfsinformationen, die mit dem @(#)
Tag markiert sind. Führen Sie auf einem dieser Quelldateien (stderr.c
), erhalte ich:
$ what stderr.c
stderr.c:
File: $RCSfile: stderr.c,v $
Version: $Revision: 10.19 $
Last changed: $Date: 2017/07/10 04:54:26 $
Purpose: Error reporting routines
Author: J Leffler
Copyright: (C) JLSS 1988-2017
Product: :PRODUCT:
$Id: stderr.c,v 10.19 2017/07/10 04:54:26 jleffler Exp $
$
Die Überschrift der Datei wie folgt aussieht:
/*
@(#)File: $RCSfile: stderr.c,v $
@(#)Version: $Revision: 10.19 $
@(#)Last changed: $Date: 2017/07/10 04:54:26 $
@(#)Purpose: Error reporting routines
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 1988-2017
@(#)Product: :PRODUCT:
*/
Die anderen von what
berichtet Strings weiter unten in der Datei angezeigt werden.Einer der Leerzeilen ergibt sich aus:
#if defined(USE_STDERR_FILEDESC)
extern const char jlss_id_stderr_c_with_filedesc[];
const char jlss_id_stderr_c_with_filedesc[] =
"@(#)" __FILE__ " configured with USE_STDERR_FILEDESC";
#endif /* USE_STDERR_FILEDESC */
Der Marker dort mit einem doppelten Anführungszeichen gefolgt wird, so dass der Rest der Zeile ist nicht — berichtet es wie eine leere Zeile in der Ausgabe aussieht. Die letzte aufgelistete Zeile ist diejenige, die in der Objektdatei eingebettet ist, und daher in Programmen, die die Objektdatei verwenden, z. B. rmk
.