소규모 유틸리티는 선호 사항을 어디에 저장해야 합니까?

소규모 유틸리티는 선호 사항을 어디에 저장해야 합니까?

자체 디렉토리가 없고 실행 파일만 있는 여러 유틸리티가 있습니다. 일반적으로 /usr/local/bin에 바이너리를 넣습니다. 내가 가진 한 가지 문제는 기본 설정을 관리하는 방법입니다.

한 가지 아이디어는 환경 변수를 사용하고 사용자가 bash.rc와 같은 변수를 정의하도록 요구하는 것입니다. 그러나 나는 애플릿에 대한 다양한 기본 설정을 사용하여 bash.rc를 조작하는 것을 약간 꺼려합니다.

자체 디렉토리가 없는 소규모 유틸리티에 대한 기본 설정을 저장하는 데 적합한 장소나 방법을 정의하는 표준(또는 표준 권장 사항)이 있습니까?

답변1

대화형 데스크톱 사용을 위한 작은 유틸리티가 뒤따를 것으로 예상됩니다.XDG 기본 디렉토리 사양구성 파일을 다음 위치에 저장합니다.

$XDG_CONFIG_HOME

또는 (비어 있거나 설정되지 않은 경우) 기본값은

$HOME/.config

GUI가 아닌 도구의 경우 헤드리스 시스템이나 XDG/freedesktop 표준을 준수하지 않는 시스템에서 실행될 수 있으므로 상황이 덜 명확합니다.

$XDG_CONFIG_HOME그러나 if set 또는 if not 을 사용하는 데에는 뚜렷한 단점이 없으며 $HOME/.config어느 곳에서나 상대적으로 놀랄 일이 아닙니다.

답변2

역사적으로 많은 프로그램이 $HOME/.$PROGNAME을 사용했지만 그 결과 홈 디렉토리가 약간 복잡해졌습니다. 이제 선호되는 규칙은 $HOME/.config/$PROGNAME인 것 같습니다(현재 ~/.config에 173개의 도트 파일이 있는데, 그 중 대부분은 역사적 유물이고 ~/.config에 80개입니다).

둘 사이에는 중요한 차이점이 있다는 점에 유의하세요.구성그리고우선 사항. 전자는 시스템 전반에 걸친 정책으로 루트만 편집할 수 있는 반면, 후자는 사용자가 제어해야 합니다. 기본 설정은 $HOME 외부 어디에도 저장되어서는 안 됩니다.

답변3

보다

시스템 전체 설정이나 로컬 사용자별 구성 에 /usr/local/bin합리적으로 사용할 수 있도록 유틸리티를 여기에 넣습니다./usr/local/etc/{program_name}$HOME/.{program_name}

쉘 스크립트에서 이러한 경로 이름은 다음과 같이 $0결정될 수 있습니다 ."/usr/local/etc/${0##*/}""$HOME/.${0##*/}"

답변4

소규모 유틸리티는 선호 사항을 어디에 저장해야 합니까?

이것은 의견의 문제입니다!

표준(또는 표준 권장 사항)이 있습니까?

당신은 읽을 수 있습니다GNU 코딩 표준그 다음에슈페리어(7)

영감을 얻으려면 소스 코드와 문서를 연구해야 합니다.일부오픈 소스 소프트웨어. 그건 그렇고, 동의했다다루기 힘든그거랑 뭐가 다른데GNU 배쉬및 로그인 셸(일반적으로 에 설명되어 있음 /etc/passwd, 참조)비밀번호(5))로 변경될 수 있습니다.chsh(1);나는 사용하는 것을 선호한다zsh


영감의 원천은 다음을 포함한 기존 GNU 프로그램일 수 있습니다.GNU 이맥스또는걸프 협력 협의회

소스에서 이들 중 하나를 컴파일할 때 ./configure스크립트를 실행합니다(다음으로 실행).GNU 자동 구성) 스크립트는 일반적으로 일부 --help 명령을 허용합니다.

예를 들어, GNU emacs의 경우 ./configure --help 다음과 같습니다 .

 `configure' configures GNU Emacs 28.0.50 to adapt to many kinds of systems.

 Usage: ./configure [OPTION]... [VAR=VALUE]...

 To assign environment variables (e.g., CC, CFLAGS...), specify them as
 VAR=VALUE.  See below for descriptions of some of the useful variables.

 Defaults for the options are specified in brackets.

 Configuration:
   -h, --help              display this help and exit
       --help=short        display options specific to this package
       --help=recursive    display the short help of all the included packages
   -V, --version           display version information and exit
   -q, --quiet, --silent   do not print `checking ...' messages
       --cache-file=FILE   cache test results in FILE [disabled]
   -C, --config-cache      alias for `--cache-file=config.cache'
   -n, --no-create         do not create output files
       --srcdir=DIR        find the sources in DIR [configure dir or `..']

 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
                           [/usr/local]
   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                           [PREFIX]

 By default, `make install' will install all the files in
 `/usr/local/bin', `/usr/local/lib' etc.  You can specify
 an installation prefix other than `/usr/local' using `--prefix',
 for instance `--prefix=$HOME'.

 For better control, use the options below.

 Fine tuning of the installation directories:
   --bindir=DIR            user executables [EPREFIX/bin]
   --sbindir=DIR           system admin executables [EPREFIX/sbin]
   --libexecdir=DIR        program executables [EPREFIX/libexec]
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
   --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
   --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
   --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
   --infodir=DIR           info documentation [DATAROOTDIR/info]
   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
   --mandir=DIR            man documentation [DATAROOTDIR/man]
   --docdir=DIR            documentation root [DATAROOTDIR/doc/emacs]
   --htmldir=DIR           html documentation [DOCDIR]
   --dvidir=DIR            dvi documentation [DOCDIR]
   --pdfdir=DIR            pdf documentation [DOCDIR]
   --psdir=DIR             ps documentation [DOCDIR]

 Program names:
   --program-prefix=PREFIX            prepend PREFIX to installed program names
   --program-suffix=SUFFIX            append SUFFIX to installed program names
   --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

 X features:
   --x-includes=DIR    X include files are in DIR
   --x-libraries=DIR   X library files are in DIR

 System types:
   --build=BUILD     configure for building on BUILD [guessed]
   --host=HOST       cross-compile to build programs to run on HOST [BUILD]

 Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-ns-self-contained
                           disable self contained build under NeXTstep
   --enable-locallisppath=PATH
                           directories Emacs should search for lisp files
                           specific to this site
   --enable-checking[=LIST]
                           enable expensive checks. With LIST, enable only
                           specific categories of checks. Categories are:
                           all,yes,no. Flags are: stringbytes, stringoverrun,
                           stringfreelist, structs, glyphs
   --enable-profiling      build emacs with low-level, gprof profiling support.
                           Mainly useful for debugging Emacs itself. May not
                           work on all platforms. Stops profiler.el working.
   --enable-autodepend     automatically generate dependencies to .h-files.
                           Requires gcc, enabled if found.
   --enable-gtk-deprecation-warnings
                           Show Gtk+/Gdk deprecation warnings for Gtk+ >= 3.0
   --disable-build-details Make the build more deterministic by omitting host
                           names, time stamps, etc. from the output.
   --disable-largefile     omit support for large files
   --enable-gcc-warnings[=TYPE]
                           control generation of GCC warnings. The TYPE 'yes'
                           means to fail if any warnings are issued;
                           'warn-only' means issue warnings without failing
                           (default for developer builds); 'no' means disable
                           warnings (default for non-developer builds).
   --enable-check-lisp-object-type
                           Enable compile time checks for the Lisp_Object data
                           type, which can catch some bugs during development.
   --enable-link-time-optimization
                           build with link-time optimization (experimental; see
                           INSTALL)
   --disable-silent-rules  verbose build output (undo: "make V=0")
   --enable-cross-guesses={conservative|risky}
                           specify policy for cross-compilation guesses
   --disable-acl           do not support ACLs

 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-all           omit almost all features and build small executable
                           with minimal dependencies
   --with-mailutils        rely on GNU Mailutils, so that the --without-pop
                           through --with-mailhost options are irrelevant; this
                           is the default if GNU Mailutils is installed
   --with-pop              Support POP mail retrieval if Emacs movemail is used
                           (not recommended, as Emacs movemail POP is
                           insecure). This is the default only on native
                           MS-Windows.
   --with-kerberos         support Kerberos-authenticated POP
   --with-kerberos5        support Kerberos version 5 authenticated POP
   --with-hesiod           support Hesiod to get the POP server host
   --with-mail-unlink      unlink, rather than empty, mail spool after reading
   --with-mailhost=HOSTNAME
                           string giving default POP mail host
   --with-sound=VALUE      compile with sound support (VALUE one of: yes, alsa,
                           oss, bsd-ossaudio, no; default yes). Only for
                           GNU/Linux, FreeBSD, NetBSD, MinGW, Cygwin.
   --with-pdumper=VALUE    enable pdumper support unconditionally ('yes', 'no',
                           or 'auto': default 'auto')
   --with-unexec=VALUE     enable unexec support unconditionally ('yes', 'no',
                           or 'auto': default 'auto')
   --with-dumping=VALUE    kind of dumping to use for initial Emacs build
                           (VALUE one of: pdumper, unexec, none; default
                           pdumper)
   --with-x-toolkit=KIT    use an X toolkit (KIT one of: yes or gtk, gtk2,
                           gtk3, lucid or athena, motif, no)
   --with-wide-int         prefer wide Emacs integers (typically 62-bit); on
                           32-bit hosts, this allows buffer and string size up
                           to 2GB, at the cost of 10% to 30% slowdown of Lisp
                           interpreter and larger memory footprint
   --without-xpm           don't compile with XPM image support
   --without-jpeg          don't compile with JPEG image support
   --without-tiff          don't compile with TIFF image support
   --without-gif           don't compile with GIF image support
   --without-png           don't compile with PNG image support
   --without-rsvg          don't compile with SVG image support
   --without-lcms2         don't compile with Little CMS support
   --without-libsystemd    don't compile with libsystemd support
   --without-cairo         don't compile with Cairo drawing
   --without-xml2          don't compile with XML parsing support
   --with-imagemagick      compile with ImageMagick image support
   --without-native-image-api
                           don't use native image APIs (GDI+ on Windows)
   --with-json             compile with native JSON support
   --without-xft           don't use XFT for anti aliased fonts
   --without-harfbuzz      don't use HarfBuzz for text shaping
   --without-libotf        don't use libotf for OpenType font support
   --without-m17n-flt      don't use m17n-flt for text shaping
   --without-toolkit-scroll-bars
                           don't use Motif/Xaw3d/GTK toolkit scroll bars
   --without-xaw3d         don't use Xaw3d
   --without-xim           at runtime, default X11 XIM to off
   --without-xdbe          don't use X11 double buffering support
   --with-ns               use Nextstep (macOS Cocoa or GNUstep) windowing
                           system. On by default on macOS.
   --with-w32              use native MS Windows GUI in a Cygwin build
   --without-gpm           don't use -lgpm for mouse support on a GNU/Linux
                           console
   --without-dbus          don't compile with D-Bus support
   --with-gconf            compile with Gconf support (Gsettings replaces this)
   --without-gsettings     don't compile with GSettings support
   --without-selinux       don't compile with SELinux support
   --without-gnutls        don't use -lgnutls for SSL/TLS support
   --without-zlib          don't compile with zlib decompression support
   --without-modules       don't compile with dynamic modules support
   --without-threads       don't compile with elisp threading support
   --with-file-notification=LIB
                           use a file notification library (LIB one of: yes,
                           inotify, kqueue, gfile, w32, no)
   --with-xwidgets         enable use of xwidgets in Emacs buffers (requires
                           gtk3 or macOS Cocoa)
   --without-makeinfo      don't require makeinfo for building manuals
   --without-compress-install
                           don't compress some files (.el, .info, etc.) when
                           installing. Equivalent to: make GZIP_PROG= install
   --with-gameuser=USER_OR_GROUP
                           user for shared game score files. An argument
                           prefixed by ':' specifies a group instead.
   --with-gnustep-conf=FILENAME
                           name of GNUstep configuration file to use on systems
                           where the command 'gnustep-config' does not work;
                           default $GNUSTEP_CONFIG_FILE, or
                           /etc/GNUstep/GNUstep.conf
   --with-x                use the X Window System
   --without-libgmp        do not use the GNU Multiple Precision (GMP) library;
                           this is the default on systems lacking libgmp.
   --without-included-regex
                           don't compile regex; this is the default on systems
                           with recent-enough versions of the GNU C Library
                           (use with caution on other systems).

 Some influential environment variables:
   CC          C compiler command
   CFLAGS      C compiler flags
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
   LIBS        libraries to pass to the linker, e.g. -l<library>
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
   PKG_CONFIG  path to pkg-config utility
   PKG_CONFIG_PATH
               directories to add to pkg-config's search path
   PKG_CONFIG_LIBDIR
               path overriding pkg-config's built-in search path
   ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config
   ALSA_LIBS   linker flags for ALSA, overriding pkg-config
   XMKMF       Path to xmkmf, Makefile generator for X Window System
   OBJC        Objective C compiler command
   OBJCFLAGS   Objective C compiler flags
   RSVG_CFLAGS C compiler flags for RSVG, overriding pkg-config
   RSVG_LIBS   linker flags for RSVG, overriding pkg-config
   IMAGEMAGICK_CFLAGS
               C compiler flags for IMAGEMAGICK, overriding pkg-config
   IMAGEMAGICK_LIBS
               linker flags for IMAGEMAGICK, overriding pkg-config
   GTK_CFLAGS  C compiler flags for GTK, overriding pkg-config
   GTK_LIBS    linker flags for GTK, overriding pkg-config
   WEBKIT_CFLAGS
               C compiler flags for WEBKIT, overriding pkg-config
   WEBKIT_LIBS linker flags for WEBKIT, overriding pkg-config
   DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config
   DBUS_LIBS   linker flags for DBUS, overriding pkg-config
   GSETTINGS_CFLAGS
               C compiler flags for GSETTINGS, overriding pkg-config
   GSETTINGS_LIBS
               linker flags for GSETTINGS, overriding pkg-config
   GCONF_CFLAGS
               C compiler flags for GCONF, overriding pkg-config
   GCONF_LIBS  linker flags for GCONF, overriding pkg-config
   GOBJECT_CFLAGS
               C compiler flags for GOBJECT, overriding pkg-config
   GOBJECT_LIBS
               linker flags for GOBJECT, overriding pkg-config
   LIBGNUTLS_CFLAGS
               C compiler flags for LIBGNUTLS, overriding pkg-config
   LIBGNUTLS_LIBS
               linker flags for LIBGNUTLS, overriding pkg-config
   LIBSYSTEMD_CFLAGS
               C compiler flags for LIBSYSTEMD, overriding pkg-config
   LIBSYSTEMD_LIBS
               linker flags for LIBSYSTEMD, overriding pkg-config
   JSON_CFLAGS C compiler flags for JSON, overriding pkg-config
   JSON_LIBS   linker flags for JSON, overriding pkg-config
   KQUEUE_CFLAGS
               C compiler flags for KQUEUE, overriding pkg-config
   KQUEUE_LIBS linker flags for KQUEUE, overriding pkg-config
   GFILENOTIFY_CFLAGS
               C compiler flags for GFILENOTIFY, overriding pkg-config
   GFILENOTIFY_LIBS
               linker flags for GFILENOTIFY, overriding pkg-config
   CAIRO_CFLAGS
               C compiler flags for CAIRO, overriding pkg-config
   CAIRO_LIBS  linker flags for CAIRO, overriding pkg-config
   FREETYPE_CFLAGS
               C compiler flags for FREETYPE, overriding pkg-config
   FREETYPE_LIBS
               linker flags for FREETYPE, overriding pkg-config
   FONTCONFIG_CFLAGS
               C compiler flags for FONTCONFIG, overriding pkg-config
   FONTCONFIG_LIBS
               linker flags for FONTCONFIG, overriding pkg-config
   XFT_CFLAGS  C compiler flags for XFT, overriding pkg-config
   XFT_LIBS    linker flags for XFT, overriding pkg-config
   LIBOTF_CFLAGS
               C compiler flags for LIBOTF, overriding pkg-config
   LIBOTF_LIBS linker flags for LIBOTF, overriding pkg-config
   M17N_FLT_CFLAGS
               C compiler flags for M17N_FLT, overriding pkg-config
   M17N_FLT_LIBS
               linker flags for M17N_FLT, overriding pkg-config
   HARFBUZZ_CFLAGS
               C compiler flags for HARFBUZZ, overriding pkg-config
   HARFBUZZ_LIBS
               linker flags for HARFBUZZ, overriding pkg-config
   LCMS2_CFLAGS
               C compiler flags for LCMS2, overriding pkg-config
   LCMS2_LIBS  linker flags for LCMS2, overriding pkg-config
   PNG_CFLAGS  C compiler flags for PNG, overriding pkg-config
   PNG_LIBS    linker flags for PNG, overriding pkg-config
   XRANDR_CFLAGS
               C compiler flags for XRANDR, overriding pkg-config
   XRANDR_LIBS linker flags for XRANDR, overriding pkg-config
   XINERAMA_CFLAGS
               C compiler flags for XINERAMA, overriding pkg-config
   XINERAMA_LIBS
               linker flags for XINERAMA, overriding pkg-config
   XFIXES_CFLAGS
               C compiler flags for XFIXES, overriding pkg-config
   XFIXES_LIBS linker flags for XFIXES, overriding pkg-config
   LIBXML2_CFLAGS
               C compiler flags for LIBXML2, overriding pkg-config
   LIBXML2_LIBS
               linker flags for LIBXML2, overriding pkg-config

 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.

 Report bugs to <[email protected]>.
 GNU Emacs home page: <https://www.gnu.org/software/emacs/>.
 General help using GNU software: <http://www.gnu.org/gethelp/>.

나는 종종 최신 GNU emacs 스냅샷을 기준으로 컴파일합니다. 나는 그랬다:

'./configure'  'CC=gcc-10' 'CFLAGS=-O2 -g' '--program-suffix=-trunk' \
               '--prefix=/usr/local' '--sysconfdir=/etc/local'

config.status생성된 파일 에 저장됩니다 .

그런데 구성 옵션을 얻으려면걸프 협력 협의회빨리 달려gcc -v

Linux 패키지 관리 시스템에 대한 연구를 고려할 수도 있습니다.

예를 들어더반(또는 선호하는 GNU/Linux 배포판)을 읽고 읽어보세요.처음부터 리눅스.

또한 읽어보세요Linux 파일 시스템 계층 표준.

Solaris 또는 MacOSX와 같은 다른 POSIX 또는 Unix 계열 시스템에서는 상황이 다음과 같습니다.약간다른.

프로그램 옵션을 통해 옵션을 전달하도록 결정할 수 있습니다. 그럼 또한 참조이것답변.

내가 코딩하고 있는 여러 오픈 소스 프로그램에서는 환경 변수에 관한 규칙도 문서화합니다(참조:환경(7)다음을 사용하여 쿼리합니다.환경 가져오기(3)...) 그리고 나는 종종 공통 접두사를 사용하기로 결정합니다. 그래서참조 시스템우리는 확실히 이 프로젝트(오픈 소스 상징적 인공 지능 프로젝트)를 사용하여 REFPERSYS_코드를 작성하고 있습니다 getenv("REFPERSYS_HOME").비스몬드(정적 분석/소프트웨어 엔지니어링 도구이륜 전차그리고디코더유럽 ​​​​프로젝트를 참조하십시오이 초안보고서) 접두사는BISMON_

그래픽 사용자 인터페이스 애플리케이션의 경우 선호하는 GUI 프레임워크(예:Qt또는GTK) 자신의 기본 설정을 정의하십시오.

또한 프로그램에 일부 통역사를 포함시키는 것을 고려하십시오.

쉽게 삽입할 수 있습니다.루아또는GNU 길러(또는파이썬) C 또는 C++로 작성된 프로그램에서. 이러한 인터프리터에는 고유한 규칙과 구문이 있습니다. 일부 확장기존의이러한 스크립팅 언어의 고급 사용자는 통역사에 익숙할 수 있습니다.

또한 플러그인을 사용하여 프로그램을 확장하는 것도 고려해 보세요.

Linux에서는 플러그인이 다음을 통해 로드됩니다.드로펜(3)그리고 사용하여dlsym(3)C 또는 C++로 코딩된 프로그램에서. 이를 수락하는 경우 프로그램의 공개 API를 문서화하세요.

많은 주요 Linux 프로그램(특히파이어폭스 브라우저브라우저와 GCC 컴파일러도GNU가 만든다또는다루기 힘든) 수용하다플러그인. 장점은 확장성이 더 쉬워지고 고급 사용자가 이를 사용자 정의하기 위해 거대한 오픈 소스 프로그램을 다시 컴파일할 필요가 없다는 것입니다. 또 다른 장점은 속도입니다. 그러나 플러그인 API를 배우는 것은 엄청난 노력입니다.

관련 정보