如何在没有Readline支持的bash实例中设置不区分大小写的完成

时间:2015-04-01 07:58:37

标签: bash shell gnu readline bash-completion

我有一个没有Readline支持的bash实例,即使用--noediting选项调用此bash。原因是这个bash实例被另一个程序使用。

另一个程序想知道这个bash如何完成命令行,为此它在bash shell中发出compgen命令,例如。

compgen -o default I

这在没有Readline支持的情况下完全适用于我的bash。这里有一个例子:让我们说,我们在一个包含三个文件的目录中:

IMG_1234.JPG
about.html
index.html

命令compgen -o default I正确打印

IMG_1234.JPG

但是现在我想切换到不区分大小写的完成。通常我在shell中发出

bind 'set completion-ignore-case on'

在bash实例 Readline支持所有内容都符合预期:compgen -o default I打印

IMG_1234.JPG
index.html

但是在我的bash实例没有 Readline支持的情况下,bind命令什么都不做,我仍然只获得IMG_1234.JPG匹配。

所以,我的问题是:如何在没有Readline支持的情况下调用的bash实例中设置不区分大小写的完成建议(当使用compgen时)?

1 个答案:

答案 0 :(得分:1)

测试程序:

#!/bin/bash
set -e

echo "### CASE-SENSITIVE"
bash --noediting <<EOF
compgen -o default I
EOF
echo
echo "### CASE-FOLDING"
bash --noediting <<EOF
bind 'set completion-ignore-case on'
compgen -o default I
EOF

结果:

### CASE-SENSITIVE
IMG_1234.JPG

### CASE-FOLDING
bash: line 1: bind: warning: line editing not enabled
IMG_1234.JPG
index.html

Bash版本:

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

如果您的bash版本不同,请考虑升级,因为我无法使用4.3.11重现您的问题。 (而且你可能想要从bind命令重定向stderr;我把它留在了所以你可以看到它被执行了。