我正在使用complete
bash-builtinin为我的python脚本启用任意自动完成功能。我将其设置为:
complete -C './script.py --compgen "$@"' ./script.py
这样,每当bash尝试自动完成时,它都会使用标志--compgen
调用我的脚本,该标志告诉我的脚本进行自动完成。效果很好。
但是,在某些情况下,我希望能够从script.py
内退回到bash的默认行为。有没有办法告诉complete
它应该在不调用我的脚本的情况下重新运行,而是执行其默认操作?
基本上,我想避免在引用文件时重新实现文件名扩展。
答案 0 :(得分:4)
在您的Python代码中尝试以下操作:
import os
# if failed:
os.system("bash -c 'compgen -o default'")
答案 1 :(得分:0)
事实证明,从python脚本输出import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class FilePusher {
private DataOutputStream dos;
public FilePusher(DataOutputStream outputStream){
this.dos = outputStream;
}
public void pushFile(byte[] bytes) throws IOException {
try {
dos.writeInt(bytes.length); // send file "size"
dos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
的后备方法的缺点是无法转义。因此,如果用户尝试填写compgen
之类的文件名,则命令行将更改为:
a/b/c d.txt
到
./script.py a/b/c\ d.txt
点击选项卡后的。其他扩展也将中断。 内置的./script.py a/b/c d.txt
确实提供了后备功能,但是:
complete
这是告诉完成操作首先尝试complete -C './script.py --compgen "$@"' -o default ./script.py
# ^^^^^^^^^^
部分,如果该部分返回零匹配项,它将要求默认完成,然后进行文件名解析等。
我发现甚至可以通过完全返回空字符串作为建议来强迫完成不提供任何建议。这样可以防止运行后备广告,但是它也不会算作完成的实际建议,因此不会考虑空字符串。