使用argparse完成Bash选项卡不会显示目录中的所有文件

Fra*_*ter 3 python bash shell argparse

我注意到,如果使用argparse参数,bash选项卡完成返回的文件较少.我该如何更改/控制?

最小的示例代码

me@here:~/test$ cat argparsetest.py 
import argparse
parser.add_argument('-i', help='input', required=True)
Run Code Online (Sandbox Code Playgroud)

bash完成示例:

# shows all the files 
me@here:~/test$ python argparsetest.py 
argparsetest.py  result.png       u1.py  

# does not show the image result.png I am actually interested in
me@here:~/test$ python argparsetest.py -i
argparsetest.py  u1.py            
Run Code Online (Sandbox Code Playgroud)

已经有两个类似的问题,但我没有发现它们有用.

rbp*_*rbp 8

这与argparse甚至Python本身无关.您可能已启用" 可编程bash完成 ",并且完成规则正在混淆,因为您的命令行以"python"开头.

解决这个问题的最简单方法是添加到python文件的顶部:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

,然后使Python脚本可执行:

me@here:~/test$ chmod u+x argparsetest.py 
Run Code Online (Sandbox Code Playgroud)

然后直接调用它,而不显式调用"python":

me@here:~/test$ ./argparsetest.py<TAB>
argparsetest.py  result.png       u1.py  

me@here:~/test$ ./argparsetest.py -i<TAB>
argparsetest.py  result.png       u1.py  
Run Code Online (Sandbox Code Playgroud)

或者,您可以完全关闭bash完成

complete -r
Run Code Online (Sandbox Code Playgroud)

并且,如果要在将来的会话中禁用它,请注释掉或删除〜/ .bashrc或/ etc/bashrc中可能如下所示的行:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
Run Code Online (Sandbox Code Playgroud)