如何将模式添加到 bash 完成(用于解压缩)?

Ale*_*lex 13 bash autocomplete

当我打字

unzip <tab>
Run Code Online (Sandbox Code Playgroud)

我得到了所有以 结尾的文件的列表.zip,这是unzip命令的选项卡完成的标准行为。

但是,除了文件之外,我还希望对以.unzip结尾的列表文件进行bash 补全。我怎样才能在我的本地实现这种行为?.udp.zip.bashrc

Run*_*ium 24

而不是继续评论......


complete -f -X '!*.@(zip|udp)' unzip
Run Code Online (Sandbox Code Playgroud)

应该添加完成

-f -X '!*.@(zip|udp)'
 |  |  | |||________|
 |  |  | ||     |
 |  |  | ||     +- filterpat: zip or udp
 |  |  | |+-------------  @ : Matches one of the given patterns
 |  |  | +-------------- *. : Anything+<dot>
 |  |  +----------------  ! : Negate
 |  +------------------- -X : Filter out matches in "filterpat"
 +---------------------- -f : files
Run Code Online (Sandbox Code Playgroud)

换句话说:完成文件并删除所有不以.zip或结尾的文件.udp


附加功能

如果添加-o default完成将完成/匹配所有文件和目录,如果没有.zip或结尾的文件.udp

如果添加-o plusdirs完成,除了.zip或结尾的文件的任何匹配项,还会添加任何目录.udp

当前的

当您使用时,complete -p unzip您将获得当前模式。

从您的评论来看,您似乎缺少其中之一+或缺少@模式,例如:

# Err:
complete -f -X '!*.(zip|udp)' unzip
                   |
                   +---- Missing + or @
Run Code Online (Sandbox Code Playgroud)

这意味着匹配任何字面上以.(zip|udp). 例如

touch 'file_test.(zip|udp)'
Run Code Online (Sandbox Code Playgroud)

另请查看手册的这一部分:

可能例如extglob未启用。启用方式:

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

shopt通过输入以下命令检查所有设置的当前状态:

shopt
Run Code Online (Sandbox Code Playgroud)

功能

如果是-F something这样,则意味着它使用名为something的函数来生成完成列表。

_filedir_xspec通常是一个Debian功能。你可能有这样的事情:

$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Run Code Online (Sandbox Code Playgroud)

这意味着/usr/share/bash-completion/bash_completion获得来源。您将在此处找到相关函数。再往下几行,你会看到这个函数/完成是由一个名为的函数添加的_install_xspec,例如:

_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
Run Code Online (Sandbox Code Playgroud)

手动输入:


更新评论 1:

– 由于无效的存档或文件权限,不匹配。

这不应该影响结果。complete只匹配规则给出的文件,不处理文件。如果你可以用 列出它们ls,它们应该匹配。

作为旁注,可以通过使用完整的功能添加这样的功能:

function _unzip_validated() {
    # 1. Generate list of files ending in e.g. .zip and .udp
    # 2. Validate each file and remove invalid ones from file list.
}

complete -F _unzip_validated unzip
Run Code Online (Sandbox Code Playgroud)

- 颜色。为什么ls区分test.ziptest.upd

这不影响complete。颜色由ls提供$LS_COLORS。尝试:

echo "$LS_COLORS" | tr : '\n' | sort
Run Code Online (Sandbox Code Playgroud)

你应该看到类似的东西*.zip=01;31,这意味着:

*.zip=01;31
|____| |  |
   |   |  +--- Red
   |   +------ Bold
   +---------- Files with .zip extension
Run Code Online (Sandbox Code Playgroud)

*.udp 另一方面,没有与之关联的条目,因此没有着色。


下一步(应该是第一步)

  1. 打开终端并转到包含测试文件的目录。.zip 和 .udp
  2. 进入 bash --norc
  3. 进入 complete -f -X '!*.@(zip|udp)' unzip
  4. 进入 shopt -s extglob
  5. 进入 unzip <tab><tab>

结果?

此外,单击问题下方的编辑并添加以下输出:

bind -V
shopt
env
Run Code Online (Sandbox Code Playgroud)

可能会有所帮助。


mkc*_*mkc 2

尝试在 .bashrc 中添加这一行:

complete -f -o default -X '!*.+(zip|udp)' unzip
Run Code Online (Sandbox Code Playgroud)