Что означает "@ ( # ) " в комментариях?
в OpenBSD в код здесь, есть комментарий, который заканчивается:
@(#)init_main.c 8.9 (Berkeley) 1/21/94
какова цель @(#)
? Я бы предположил, что это сделать поиск проще, но почему @(#)
конкретно, а не другой, более значимый шаблон символов типа INFO:
? Я знаю, что это не OpenBSD, потому что я помню, что видел это раньше.
2 ответов
это маркер для информации о версии SCCS, что what
программа ищет. Он сообщит, что следует за одним из нескольких конечных маркеров: null byte, newline, double quote "
, больше >
и слеш \
.
что is SCCS? Он расшифровывается как система управления исходным кодом и был разработан Marc J Rochkind at & T (Bell Labs) для Unix. Это был первый широко используемый Unix-based VCS (система управления версиями), и стандартизирован в POSIX с командами admin
, delta
, get
, prs
, rmdel
, unget
и what
. Классическая (AT&T) версия включала команды cdc
, comb
, help
(да, он опередил это имя; его иногда называют sccshelp
в эти дни), sact
, sccsdiff
и val
тоже. В некоторых системах предусмотрена программа sccs
, что нравится cvs
или git
, принимает имя команды в качестве первого аргумента. SCCS был закрытым источником. Сообщество с открытым исходным кодом использовало first RCS и позже CVS вместо этого, а позже было изобилие других альтернатив, таких как Git, в Subversion, ртутный, ископаемых, базар, ... вы можете найти по крайней мере две версии SCCS с открытым исходным кодом: Schily-SCCS и CSSC (переосмысление GNU SCCS), которые в значительной степени совместимы с SCCS. SCCS является централизованным VCS, как RCS и многие другие системы, в отличие от распределенных VCS (DVCS), таких как Git. Ожидается, что где-то будет храниться основная версия управляемых SCCS файлов.
, почему @(#)
вместо INFO
или другие обозначения, причина заключалась именно в том, чтобы избежать любой вероятной путаницы с обычным текстом. Это очень маловероятно, что вы когда-либо причина для записи этой последовательности символов, отличной от маркера SCCS.
я использую его перед RCS $Id$
строк (которые могут быть отслежены ident
из пакета RCS). Так, например, my 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
), I получить:
$ 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
.
это воспоминание о старом AT & T sccs
код. Это старый система пересмотра исходного кода как rcs
для поддержания различных версий файла (это было заменено системами, которые позволили поддерживать целые версии каталога, такие как cvs
или git
). В настоящее время, он был полностью заменен новым программным обеспечением пересмотра в пользе... но это были метки для идентификации специальных строк в объектном коде. Система версий исходного кода использовала эту последовательность как некоторая вводная (и редкая) escape-последовательность, которая позволила ей идентифицировать строки, которые вы видите в коде. Эти строки позволяют автоматически обрабатывать атрибуты в исходных файлах, как в примере кода, опубликованном в других ответах.