NAME

optex - 범용 명령 옵션 래퍼

VERSION

Version 1.0601

SYNOPSIS

옵텍스 명령 [ -M모듈 ] ...

또는 명령 -> 옵텍스 심볼릭 링크, 또는

옵텍스 옵션 [ -l | -m ] ...

--link,   --ln  create symlink
--unlink, --rm  remove symlink
--ls            list link files
--rc            list rc files
--nop, -x       disable option processing
--[no]module    disable module option on arguments

DESCRIPTION

옵텍스는 Perl 모듈 Getopt::EX를 사용하는 범용 명령 옵션 처리 래퍼입니다. 이를 통해 사용자는 시스템의 모든 명령에 대해 고유한 옵션 별칭을 정의하고 모듈 스타일의 확장성을 제공할 수 있습니다.

대상 명령은 인자로 주어집니다:

% optex command

또는 옵텍스에 대한 심볼릭 링크 파일로 지정할 수 있습니다:

command -> optex

구성 파일 ~/.optex.d/command.rc가 존재하면 실행 전에 평가되고 명령 인수는 이를 사용하여 사전 처리됩니다.

OPTION ALIASES

-I[TIMESPEC] 옵션이 없는 macOS의 date 명령을 생각해보세요. 옵텍스를 사용하면 ~/.optex.d/date.rc 파일에 다음 설정을 준비하여 이를 구현할 수 있습니다.

option -I        -Idate
option -Idate    +%F
option -Iseconds +%FT%T%z
option -Iminutes +%FT%H:%M%z
option -Ihours   +%FT%H%z

option --iso-8601         -I
option --iso-8601=date    -Idate
option --iso-8601=seconds -Iseconds
option --iso-8601=minutes -Iminutes
option --iso-8601=hours   -Ihours

그러면 다음 명령이 예상대로 작동합니다.

% optex date -Iseconds

명령어 검색 경로에서 심볼릭 링크 date -> optex가 발견되면 표준 명령어와 동일하게 사용할 수 있지만 지원되지 않는 옵션을 사용할 수 있습니다.

% date -Iseconds

공통 설정은 ~/.optex.d/default.rc 파일에 저장되며, 해당 규칙은 옵텍스를 통해 실행되는 모든 명령에 적용됩니다.

사실 --iso-8601 옵션은 이렇게 더 간단하게 정의할 수 있습니다:

option --iso-8601 -I$<shift>

이것은 거의 항상 정상적으로 작동하지만, 이렇게 다른 옵션 앞에 --iso-8601 옵션만 있으면 실패합니다:

% date --iso-8601 -u

COMMAND ALIASES

옵텍스의 명령어 별칭은 셸의 별칭 기능과 다르지 않지만, 도구나 스크립트에서 명령어로 실행할 수 있고 설정 파일에서 일괄적으로 관리할 수 있다는 점에서 효과적입니다.

명령 별칭은 다음과 같이 구성 파일(~/.optex.d/config.toml)에서 설정할 수 있습니다:

[alias]
    tc = "optex -Mtextconv"

tc에서 옵텍스로 다음과 같이 심볼릭 링크를 만들 수 있습니다:

% optex --ln tc

그리고 PATH 환경 설정에 $HOME/.optex.d/bin을 포함하세요.

textconv 모듈은 인자로 지정된 파일을 일반 텍스트로 변환하는 데 사용할 수 있습니다. 이렇게 정의된 Word 파일은 다음과 같이 비교할 수 있습니다.

% tc diff A.docx B.docx

별칭 이름은 rc 파일 및 모듈 디렉토리를 찾는 데 사용됩니다. 위의 예에서는 ~/.optex.d/tc.rc~/.optex.d/tc/가 참조됩니다.

구성 파일에 셸 스크립트를 작성할 수도 있습니다. 다음 예제에서는 C-shell repeat 명령을 구현합니다.

[alias]
        repeat = [ 'bash', '-c', '''
            while getopts 'c:i:' OPT; do
                case $OPT in
                    c) count=$OPTARG;;
                    i) sleep=$OPTARG;;
                esac
            done; shift $((OPTIND - 1))
            case $1 in
                [0-9]*) count=$1; shift;;
            esac
            while ((count--)); do
                eval "$*"
                [ "$sleep" ] && (( count > 0 )) && sleep $sleep
            done
        ''', 'repeat' ]

"구성 파일" 섹션을 읽습니다.

MACROS

매크로 define을 사용하여 복잡한 문자열을 구성할 수 있습니다. 다음 예는 텍스트의 모음을 계산하는 awk 스크립트로, 파일 ~/.optex.d/awk.rc에 선언됩니다.

define __delete__ /[bcdfgkmnpsrtvwyz]e( |$)/
define __match__  /ey|y[aeiou]*|[aeiou]+/
define __count_vowels__ <<EOS
{
    s = tolower($0);
    gsub(__delete__, " ", s);
    for (count=0; match(s, __match__); count++) {
        s=substr(s, RSTART + RLENGTH);
    }
    print count " " $0;
}
EOS
option --vowels __count_vowels__

다음과 같이 사용할 수 있습니다:

% awk --vowels /usr/share/dict/words

복잡한 옵션을 설정할 때는 expand 지시어가 유용합니다. expand옵션과 거의 동일하게 작동하지만 파일 범위 내에서만 유효하며 명령줄 옵션에는 사용할 수 없습니다.

expand repository   ( -name .git -o -name .svn -o -name RCS )
expand no_dots      ! -name .*
expand no_version   ! -name *,v
expand no_backup    ! -name *~
expand no_image     ! -iname *.jpg  ! -iname *.jpeg \
                    ! -iname *.gif  ! -iname *.png
expand no_archive   ! -iname *.tar  ! -iname *.tbz  ! -iname *.tgz
expand no_pdf       ! -iname *.pdf

option --clean \
        repository -prune -o \
        -type f \
        no_dots \
        no_version no_backup \
        no_image \
        no_archive \
        no_pdf

% find . --clean -print

MODULES

옵텍스는 모듈 확장도 지원합니다. date의 예에서 모듈 파일은 ~/.optex.d/date/ 디렉토리에 있습니다. 기본 모듈인 ~/.optex.d/date/default.pm이 존재하면 실행할 때마다 자동으로 로드됩니다.

이것은 일반적인 Perl 모듈이므로 패키지 선언과 최종 참값이 필요합니다. 그 사이에 모든 종류의 Perl 코드를 넣을 수 있습니다. 예를 들어, 다음 프로그램은 date 명령을 실행하기 전에 환경 변수 LANGC로 설정합니다.

package default;
$ENV{LANG} = 'C';
1;

% /bin/date
2017年 10月22日 日曜日 18時00分00秒 JST

% date
Sun Oct 22 18:00:00 JST 2017

다른 모듈은 -M 옵션을 사용하여 로드합니다. 다른 옵션과 달리 -M은 인자 목록의 맨 앞에 위치해야 합니다. ~/.optex.d/date/ 디렉토리에 있는 모듈 파일은 date 명령에만 사용됩니다. 모듈이 ~/.optex.d/ 디렉토리에 있으면 모든 명령어에서 사용할 수 있습니다.

-Mes 모듈을 사용하려면 다음과 같은 내용으로 ~/.optex.d/es.pm 파일을 생성합니다.

package es;
$ENV{LANG} = 'es_ES';
1;

% date -Mes
domingo, 22 de octubre de 2017, 18:00:00 JST

라이브러리 경로에서 지정한 모듈을 찾지 못하면 옵텍스는 옵션을 무시하고 즉시 인자 처리를 중지합니다. 무시된 옵션은 대상 명령으로 전달됩니다.

모듈은 서브루틴 호출에도 사용됩니다. ~/.optex.d/env.pm 모듈이 다음과 같다고 가정해 보겠습니다:

package env;
sub setenv {
    while (($a, $b) = splice @_, 0, 2) {
        $ENV{$a} = $b;
    }
}
1;

그러면 좀 더 일반적인 방식으로 사용할 수 있습니다. 다음 예제에서는 첫 번째 형식이 읽기 쉽지만, 두 번째 형식은 이스케이프할 특수 문자가 없기 때문에 입력하기가 더 쉽습니다.

% date -Menv::setenv(LANG=de_DE) # need shell quote
% date -Menv::setenv=LANG=de_DE  # alternative format
So 22 Okt 2017 18:00:00 JST

옵션 별칭은 모듈에서 파일 끝의 특수 리터럴 __DATA__ 뒤에 선언할 수도 있습니다. 이를 사용하여 다양한 목적에 맞는 여러 옵션 집합을 준비할 수 있습니다. 일반 i18n 모듈을 생각해 보세요:

package i18n;
1;
__DATA__
option --cn -Menv::setenv(LANG=zh_CN) // 中国語 - 簡体字
option --tw -Menv::setenv(LANG=zh_TW) // 中国語 - 繁体字
option --us -Menv::setenv(LANG=en_US) // 英語
option --fr -Menv::setenv(LANG=fr_FR) // フランス語
option --de -Menv::setenv(LANG=de_DE) // ドイツ語
option --it -Menv::setenv(LANG=it_IT) // イタリア語
option --jp -Menv::setenv(LANG=ja_JP) // 日本語
option --kr -Menv::setenv(LANG=ko_KR) // 韓国語
option --br -Menv::setenv(LANG=pt_BR) // ポルトガル語 - ブラジル
option --es -Menv::setenv(LANG=es_ES) // スペイン語
option --ru -Menv::setenv(LANG=ru_RU) // ロシア語

다음과 같이 사용할 수 있습니다:

% date -Mi18n --tw
2017年10月22日 週日 18時00分00秒 JST

~/.optex.d/optex.rc에 다음과 같이 자동 로드 모듈을 선언할 수 있습니다:

autoload -Mi18n --cn --tw --us --fr --de --it --jp --kr --br --es --ru

그러면 모듈 옵션 없이 사용할 수 있습니다. 이 경우 옵션 --ru-Mi18n --ru로 자동 대체됩니다.

% date --ru
воскресенье, 22 октября 2017 г. 18:00:00 (JST)

모듈 i18nGetopt::EX::i18n으로 구현되어 이 배포에 포함되어 있습니다. 따라서 추가 설치 없이 위와 같이 사용할 수 있습니다.

모듈은 __DATA__ 섹션에서 builtin 지시어를 사용하여 기본 제공 옵션을 정의할 수도 있습니다. 기본 제공 옵션은 Getopt::Long에 의해 처리되며 대상 명령어 이름 앞에 지정해야 합니다. 예를 들어

optex -Mxform --xform-visible=2 cat file

여기서 --xform-visiblexform 모듈에 정의된 기본 제공 옵션입니다.

STANDARD MODULES

표준 모듈은 앱::옵텍스에 설치되며, 앱::옵텍스 접두사를 붙이거나 붙이지 않고 주소 지정이 가능합니다.

Getopt::EX MODULES

옵텍스는 자체 모듈 외에도 Getopt::EX 모듈을 사용할 수 있습니다. 설치된 표준 Getopt::EX 모듈은 다음과 같습니다.

OPTIONS

이 옵션은 심볼릭 링크에서 옵텍스가 실행된 경우에는 적용되지 않습니다.

CONFIGURATION FILE

시작할 때 optex는 TOML 형식으로 작성된 구성 파일 ~/.optex.d/config.toml을 읽습니다.

PARAMETERS

FILES AND DIRECTORIES

ENVIRONMENT

SEE ALSO

Getopt::EX, Getopt::EX::Loader, Getopt::EX::Module

App::optex::textconv

App::optex::xform

AUTHOR

Kazumasa Utashiro

LICENSE

You can redistribute it and/or modify it under the same terms as Perl itself.

Copyright ©︎ 2017-2026 Kazumasa Utashiro