NAME

optex - 通用命令选项包装器

VERSION

Version 1.01

SYNOPSIS

optex command [ -Mmodule ] ...

command -> optex 符号链接,或

optex options [ -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

optex 是一个利用 Perl 模块 Getopt::EX 的通用命令选项处理包装器。它允许用户为系统中的任何命令定义自己的选项别名,并提供模块风格的可扩展性。

目标命令作为参数给出:

% optex command

optex 的符号链接文件:

command -> optex

如果存在配置文件 ~/.optex.d/command.rc,则会在执行前对其进行评估,并使用该文件对命令参数进行预处理。

OPTION ALIASES

想想 macOS 的 date 命令,它没有 -I[TIMESPEC] 选项。使用 optex,可以通过在 ~/.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 文件中,这些规则将应用于通过 optex 执行的所有命令。

实际上,--iso-8601 选项可以定义得更简单:

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

几乎每次都能正常工作,但如果只有 --iso-8601 选项在其他选项之前,则会出现类似故障:

% date --iso-8601 -u

COMMAND ALIASES

optex 的命令别名与 shell 的别名功能并无不同,但它的高效之处在于可以作为工具或脚本的命令执行,并可在配置文件中进行统一管理。

可以在配置文件中设置命令别名 (~/.optex.d/config.toml) like this:

[alias]
    tc = "optex -Mtextconv"

可以像这样从 tc 建立符号链接到 optex

% optex --ln tc

并在 PATH 环境中包含 $HOME/.optex.d/bin

textconv 模块可用于将作为参数给定的文件转换为纯文本。以这种方式定义的 Word 文件可按如下方式进行比较。

% tc diff A.docx B.docx

别名用于查找 rc 文件和模块目录。在上例中,将引用 ~/.optex.d/tc.rc~/.optex.d/tc/

请阅读 "CONFIGURATION FILE" 部分。

MACROS

使用宏 define 可以组成复杂的字符串。下一个例子是在文件 ~/.optex.d/awk.rc 中声明的计算文本中元音的 awk 脚本。

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 的作用与 option 几乎相同,但只在文件范围内有效,不适用于命令行选项。

    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

optex 还支持模块扩展。以 date 为例,模块文件位于 ~/.optex.d/date/ 目录下。如果存在默认模块 ~/.optex.d/date/default.pm,则每次执行时都会自动加载该模块。

这是一个普通的 Perl 模块,因此包声明和最终 true 值是必要的。在它们之间,可以放入任何类型的 Perl 代码。例如,下一个程序在执行 date 命令前将环境变量 LANG 设为 C

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 将忽略该选项并立即停止参数处理。忽略的选项将传递给目标命令。

模块也用于子程序调用。假设 ~/.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)

模块 i18n 作为 Getopt::EX::i18n 实现,并包含在此发行版中。因此,无需额外安装,即可如上使用。

STANDARD MODULES

标准模块安装在 App::optex,可以使用或不使用 App::optex前缀。

-Mhelp

打印可用选项列表。选项名称与替换形式一起打印,如果已定义,则打印帮助信息。使用 -x 选项可省略帮助信息。

选项 --man-h 将打印文件(如果有)。选项 -l 将打印模块路径。选项 -m 将显示模块本身。在其他模块之后使用时,将打印最后声明模块的信息。下一条命令将显示 second 模块的文档。

% optex -Mfirst -Msecond -Mhelp --man
-Mdebug

打印调试信息。

-Mutil::argv

操作命令参数的模块。详见 App::optex::util::argv

-Mutil::filter

实现命令输入/输出过滤器的模块。详见 App::optex::util::filter

Getopt::EX MODULES

除自身模块外,optex 还可以使用 Getopt::EX 模块。已安装的标准 Getopt::EX 模块如下。

-Mi18n (Getopt::EX::i18n)

您可以通过以下操作显示希腊日历:

optex -Mi18n cal --gr

OPTIONS

从符号链接执行 optex 时,这些选项无效。

--link, --ln [ command ]

~/.optex.d/bin 目录中创建符号链接。

--unlink, --rm [ -f ] [ command ]

删除 ~/.optex.d/bin 目录中的符号链接。

--ls [ -l ] [ command ]

列出 ~/.optex.d/bin 目录中的符号链接文件。

--rc [ -l ] [ -m ] [ command ]

列出 ~/.optex.d/bin 目录中的 rc 文件。

--nop, -x command

停止选项操作。否则使用完整路径名。

--[no]module

optex 默认处理目标命令的模块选项 (-M)。不过,有一条命令也使用相同的选项。选项 --nomodule 会禁用这种行为。其他选项的解释仍然有效,在 rc 或模块文件中使用模块选项也没有问题。

--exit status

通常 optex 会以已执行命令的状态退出。该选项会覆盖它,强制以指定的状态代码退出。

CONFIGURATION FILE

启动时,optex 会读取配置文件 ~/.optex.d/config.toml,该文件应为 TOML 格式。

PARAMETERS

no-module

设置 optex 不解释模块选项 -M 的命令。如果在此列表中找到目标命令,就会像给 optex 提供选项 --no-module 一样执行该命令。

no-module = [
    "greple",
    "pgrep",
]
alias

设置命令别名。例如

[alias]
    pgrep = [ "greple", "-Mperl", "--code" ]
    hello = "echo -n 'hello world!'"

命令别名可通过符号链接和命令参数调用。

FILES AND DIRECTORIES

PERLLIB/App/optex

系统模块目录。

~/.optex.d/

个人根目录。

~/.optex.d/config.toml

配置文件。

~/.optex.d/default.rc

常用启动文件。

~/.optex.d/command.rc

command 的启动文件。

~/.optex.d/command/

command 的模块目录。

~/.optex.d/command/default.pm

command 的默认模块。

~/.optex.d/bin

存储符号链接的默认目录。

这并非必要,但将 optex 设置为包含符号链接的特殊目录,并将其置于命令搜索路径中似乎是个好主意。这样你就可以很容易地从路径中添加/删除它,或创建/删除符号链接。

ENVIRONMENT

OPTEX_ROOT

覆盖默认根目录 ~/.optex.d

OPTEX_CONFIG

覆盖默认配置文件 OPTEX_ROOT/config.toml

OPTEX_MODULE_PATH

设置以冒号 (:) 分隔的模块路径。这些路径将插入标准路径之前。

OPTEX_BINDIR

覆盖默认的符号链接目录 OPTEX_ROOT/bin

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-2024 Kazumasa Utashiro