Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OptPass和bash选项卡完成时的奇怪行为_Python_Bash - Fatal编程技术网

Python OptPass和bash选项卡完成时的奇怪行为

Python OptPass和bash选项卡完成时的奇怪行为,python,bash,Python,Bash,我正在为Linux新手构建一个脚本,所以请理解我为什么这样问:) 我的脚本如下所示: python script.py -f filename.txt python script.py -f <tab completion> # No type of tab completion works here. 我正在为此使用optparse模块。但是,在执行制表符完成时,我注意到以下几点 当我执行以下操作时,选项卡完成工作: python script.py <tab compl

我正在为Linux新手构建一个脚本,所以请理解我为什么这样问:)

我的脚本如下所示:

python script.py -f filename.txt
python script.py -f <tab completion> # No type of tab completion works here.
我正在为此使用
optparse
模块。但是,在执行制表符完成时,我注意到以下几点

当我执行以下操作时,选项卡完成工作:

python script.py <tab completion> # Tab completion works normally as expected
python script.py#选项卡完成按预期正常工作
但我这样做是行不通的:

python script.py -f filename.txt
python script.py -f <tab completion> # No type of tab completion works here.
python script.py-f#这里没有任何类型的制表符完成功能。

我真的不希望我的用户键入输入文件的名称。必须填写制表符。我怎样才能让它工作,或者我做错了什么?

这更多的是关于bash的工作方式,而不是python的工作方式。经过一点实验,看起来第二个和第二个选项卡实际上导致bash扩展


编辑:bash仅扩展
*.py
*.pyc
文件的可能原因是因为行中的第一个单词是
python
。如果您添加
#/usr/bin/env python
到python脚本的第一行,
chmod+x script.py
,然后尝试
/scipt.py-f
和制表符完成,然后会发生什么?我怀疑它会工作得很好。

这与bash的完成有关。 尝试查看您是否有自己的bash_完成脚本,并查找python

常见的完成文件位于
/etc/bash_completion
中,您应该有如下内容

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi
在您的.bashrc(_profile或其他任何内容)中

现在,您可以通过添加自己的脚本来重新定义某些行为。
请查看
/etc/bash_completion
文件以获得一些启示:

如果您希望用户有一个简化的体验(即,他们不需要了解shell如何工作以及在特定安装中如何配置),那么您的程序应该构建一个输入文件列表,并将其显示给用户供其选择。

在windows命令shell上,它可以完美地工作。啊!![python]标记和标题有点误导人:选项卡完成由shell处理
manbash
和/或(附带shell设置的详细信息)可能是一个不错的选择。值得一提的是,在OSX内置的
bash
:)@Janus:我这样问是因为它列出了Python文件(py和pyc)。但不是任何其他的延伸。我添加了bash标记。它似乎列出了Python文件(py和pyc),但没有列出任何其他类型的文件。是的,您的观察是正确的。那么这里发生了什么呢?但是我将把脚本分发给其他用户。我该如何处理他们这方面的问题呢?我先这么做了,但我认为bash完成是一种规范,这就是为什么我坚持这样做的原因。@bullfiction:bash有两种完成方式。内置型和可编程型。除非提供函数来提供默认行为以外的行为,否则您将得到的只是默认行为。如果可编程完成函数提供的行为不是您想要的,那么您必须重写它。这在很大程度上是由用户驱动的。你不应该(作为一个应用程序)干扰用户如何配置他们的环境,除非这是用户想要的。你接受的答案是处理这种情况的另一种正确方法。