我真的很想为自定义选项添加自动完成功能,但我在网上看到的所有建议都涉及更新
/etc/bash_completion.d
或~/.bashrc
。对我来说,这种方法的问题在于,这是一个全局解决方案(对于更新/etc/...
的情况下的系统和~/.bashrc
的情况下的用户)。很多时候,我有许多小脚本仅适用于它们所在的目录。因此,如果我在不同的目录中有具有相同名称的不同脚本(我经常这样做),“全局”解决方案可能会崩溃。因此,我想要一个范围仅限于当前目录的解决方案,也许可以向脚本本身添加一些代码,或者在脚本旁边添加一个“自动完成文件”。
这是我想要的示例:
~/working_directory$ cat script.sh
#!/bin/bash
if [[ "$1" == "opt1" ]]; then
echo "performing action 1"
fi
if [[ "$1" == "opt2" ]]; then
echo "performing action 2"
fi
~/working_directory$ cat script.autocomplete.txt
opt1
opt2
~/working_directory$ ./script.sh op
Options from script.autocomplete.txt:
opt1
opt2
~/working_directory$ ./script.sh opt
最后 5 行是当用户在输入某些选项的一部分后进入选项卡时我希望看到的内容。
我想要的另一个功能是,当脚本没有设置执行位(例如
bash -e script.sh
)时它可以工作,因为有时我在奇怪的 bash 环境(如 termux)中工作,其中使用 chmod
需要神秘的知识。
如果没有人回复,我想我知道如何做到这一点(我发现有一篇文章添加了通用和可自定义的自动完成功能),我将用我的发现更新这篇文章。
我想到的一个技巧是将选项作为虚拟文件放入目录中。在上面的示例中,这将替换
script.autocomplete.txt
。这是更新的示例:
~/working_directory$ cat script.sh
#!/bin/bash
if [[ "$1" == "opt1" ]]; then
echo "performing action 1"
fi
if [[ "$1" == "opt2" ]]; then
echo "performing action 2"
fi
~/working_directory$ ls opt*
opt1
opt2
~/working_directory$ ./script.sh op
opt1
opt2
~/working_directory$ ./script.sh opt
一个问题是选项是否与文件冲突。要解决此问题,您可以将选项放入目录中:
./options/opt{1,2}
并检查这些选项:
~/working_directory$ cat script.sh
#!/bin/bash
if [[ "$1" == "options/opt1" ]]; then
echo "performing action 1"
fi
if [[ "$1" == "options/opt2" ]]; then
echo "performing action 2"
fi
这仍然很hacky,但可能是一个很好的解决方案,因为无论如何它都是一个hacky问题。