2017-11-20 36 views
24

Trong mã OpenBSD here, có một bình luận kết thúc bằng:"@ (#)" trong ý kiến ​​có nghĩa là gì?

@(#)init_main.c 8.9 (Berkeley) 1/21/94 

mục đích @(#) là gì? Tôi cho rằng đó là làm cho việc tìm kiếm dễ dàng hơn, nhưng tại sao lại là @(#) cụ thể và không phải là một mẫu ký tự có ý nghĩa hơn như INFO:? Tôi biết rằng nó không phải là OpenBSD cụ thể bởi vì tôi nhớ nhìn thấy điều này trước đây.

Trả lời

31

Đó là điểm đánh dấu cho thông tin phiên bản SCCS mà chương trình what tìm kiếm. Nó sẽ báo cáo những gì theo sau một trong một số điểm đánh dấu kết thúc: null byte, newline, double quote ", lớn hơn > và dấu gạch chéo ngược \.

Điều gì SCCS? Nó là viết tắt của Source Code Control System, và được phát triển bởi Marc J Rochkind tại AT & T (Bell Labs) cho Unix. Nó là VCS dựa trên Unix được sử dụng rộng rãi (hệ thống điều khiển phiên bản), và được chuẩn hóa trong POSIX với các lệnh admin, delta, get, prs, rmdel, ungetwhat. Phiên bản cổ điển (AT & T) bao gồm các lệnh cdc, comb, help (có, nó đã làm trống tên đó; đôi khi nó được gọi là sccshelp những ngày này), sact, sccsdiffval. Một số hệ thống cung cấp một chương trình sccs rằng, như cvs hoặc git, lấy tên lệnh làm đối số đầu tiên của nó. SCCS là nguồn đóng. Cộng đồng mã nguồn mở sử dụng RCS đầu tiên và sau đó CVS thay vào đó, và sau đó đã có một phong phú lựa chọn thay thế khác, chẳng hạn như Git, Subversion, Mercurial, Fossil, Bazaar ... Bạn có thể tìm thấy ít nhất hai phiên bản mã nguồn mở của SCCS: Schily-SCCSCSSC (việc thực hiện lại GNU của SCCS), cả hai đều tương thích với SCCS. SCCS là một VCS tập trung, giống như RCS và nhiều hệ thống khác, trái ngược với VCS phân phối (DVCS) như Git. Dự kiến ​​sẽ là phiên bản chính của các tệp được SCCS quản lý được lưu trữ ở đâu đó.

Vì lý do tại sao @(#) thay vì INFO hoặc các ký hiệu khác, lý do chính xác là tránh mọi sự trộn lẫn hợp lý với văn bản thông thường. Rất có thể bạn sẽ không có lý do gì để viết chuỗi ký tự đó ngoài dấu SCCS.

Tôi sử dụng nó trước RCS $Id$ chuỗi (có thể được theo dõi riêng bởi ident từ gói RCS). Vì vậy, ví dụ, sản lượng chương trình rmk tôi:

$ 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 $ 
$ 

Nó cho phép tôi để xem phiên bản của các tập tin được sử dụng để xây dựng các chương trình, cộng với một số thông tin auxilliary được đánh dấu với thẻ @(#). Chạy trên một trong những file nguồn, (stderr.c), tôi nhận đượ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 $ 
$ 

Tiêu đề của tập tin trông giống như:

/* 
@(#)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: 
*/ 

Các chuỗi khác được báo cáo bởi what xuất hiện tiếp tục xuống các tập tin.Một trong những dòng trống phát sinh từ:

#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 */ 

Các marker có được theo sau bởi một dấu nháy kép, vì vậy phần còn lại của dòng được không được báo cáo — nó trông giống như một dòng trống ở đầu ra. Dòng được liệt kê cuối cùng là dòng được nhúng trong tệp đối tượng và do đó trong các chương trình sử dụng tệp đối tượng, chẳng hạn như rmk.

3

Đó là hồi tưởng của mã AT & T cũ sccs. Đó là hệ thống sửa đổi mã nguồn như rcs để duy trì các phiên bản khác nhau của tệp (điều này đã bị thay thế bởi hệ thống cho phép duy trì toàn bộ phiên bản thư mục, như cvs hoặc git). Ngày nay, nó đã được thay thế hoàn toàn bởi phần mềm sửa đổi mới được sử dụng ... nhưng đây là những nhãn để xác định các chuỗi đặc biệt trong mã đối tượng. Hệ thống phiên bản mã nguồn đã sử dụng trình tự đó như một chuỗi thoát hiểm giới thiệu (và hiếm) cho phép nó xác định các chuỗi bạn thấy trong mã. Các chuỗi này cho phép xử lý tự động các thuộc tính trong các tệp nguồn, giống như các chuỗi bạn thấy trong mã mẫu đã được đăng trong các câu trả lời khác.