Ответ 1
Этот маркер для информации о версии SCCS, которую ищет программа what
. Он будет сообщать, что следует за одним из нескольких конечных маркеров: нулевой байт, новая строка, двойная кавычка "
, больше >
и обратная косая черта \
.
Что такое SCCS? Он представляет собой систему управления исходным кодом и был разработан Марком Дж. Рочкиндом в AT & T (Bell Labs) для Unix. Это была первая широко используемая Unix-совместимая VCS (система управления версиями) и стандартизирована в POSIX с командами admin
, delta
, get
, prs
, rmdel
, unget
и what
. Классическая версия (AT & T) включала команды cdc
, comb
, help
(да, это упреждало это имя, иногда называемое sccshelp
в эти дни), sact
, sccsdiff
и val
тоже. Некоторые системы предоставили программу sccs
, которая, как и cvs
или git
, принимает имя команды в качестве своего первого аргумента. SCCS был закрытым источником. Сообщество с открытым исходным кодом использовало первый RCS, а позже CVS, а затем появилось множество других альтернатив, таких как Git, Subversion, Mercurial, Fossil, Bazaar,... Вы можете найти как минимум две версии SCCS с открытым исходным кодом: Schily-SCCS и CSSC (повторная реализация ГСУ GNU), которые оба в значительной степени совместимой с SCCS. SCCS - это централизованный VCS, такой как RCS и многие другие системы, в отличие от распределенных VCS (DVCS), таких как Git. Ожидается, что будет храниться где-то основная версия управляемых SCCS файлов.
Что касается причин @(#)
вместо INFO
или других обозначений, то причина заключалась в том, чтобы избежать возможного смешения с обычным текстом. Очень маловероятно, чтобы у вас когда-либо возникала причина писать эту последовательность символов, кроме как маркер SCCS.
Я использую его перед строками RCS $Id$
(которые можно отдельно отслеживать с помощью ident
из пакета RCS). Так, например, моя программа rmk
дает:
$ 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 $
$
Это позволяет мне видеть, какие версии файлов используются для сборки программы, а также некоторую вспомогательную информацию, помеченную тегом @(#)
. Запустите в одном из этих исходных файлов (stderr.c
), я получаю:
$ 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 $
$
Заголовок файла выглядит следующим образом:
/*
@(#)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:
*/
Другие строки, о которых сообщает what
, отображаются далее в файле. Одна из пустых строк возникает из:
#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 */
Затем маркер сопровождается двойной кавычкой, поэтому остальная часть строки не сообщается — он выглядит как пустая строка на выходе. Последняя строка, указанная в списке, является встроенной в объектный файл и, следовательно, в программы, которые используют объектный файл, например rmk
.