Ili*_*sev 3 bash shell perl webmin bash-completion
在实际问题之前,先简单介绍一下我正在做什么来理解这个想法。
我想为我的Authentic Theme for Webmin添加另一个很酷的功能。
我已经使Command Shell模块看起来/感觉就像普通 shell一样。然而,由于它只是一个端口,因此几乎没有限制。其中之一是缺少 shell autocomplete,当您按下Tab键(或其他基于系统的键:Esc+Esc和/或Ctrl+I)时。
我的观点是让它在本地运行。我将使用
XMLHttpRequest
对服务器的调用并将输入的命令部分传递到实际的 shell。该调用将在按键事件时触发Tab。
例如,当您处于真实主题下拉 shell 中时(您可以在上面的视频截屏中看到它),并且当您键入(假设)并xa点击时Tab,将触发该事件并发出请求。然后服务器收到一个字符串xa,我们就可以开始了。
1. 在Perl中执行此类命令的最佳方法是什么?
2、如何正确转义该命令,确保其不被利用;
3. 如何在调用中以编程方式触发 Tab键(运行自动完成)system();
4. 如何grep输出。
在回应中,xa作为一个例子,我希望得到xargs结果。
我知道传递的命令可能存在歧义,例如,在使用 时sys,以及自动完成功能不适用于单个Tab键时。我认为最好将其从当前问题的范围中排除。
如果您知道要生成的补全类型,则可以使用compgenbash 内置命令生成补全。
最有用的是,该-c选项将完成命令名称并-o default通过 readline 完成文件名。查看的选项complete,其中大部分也可以与 一起使用compgen。
请注意,system()会将命令传递给/bin/sh -c,这可能与您的系统上的不同bash。所以你可以这样做:
system(\'bash\', \'-c\', \'compgen -c -- "$1"\', \'bash\', \'xa\')\n# xargs\n# xattr\n# etc\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n或者
\nsystem(\'bash\', \'-c\', \'compgen -o default -- "$1"\', \'bash\', \'file\')\n# file.txt\n# file.pdf\n# etc\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n如果您想在给定特定字符串的情况下执行与 bash 相同的操作(而不是自己猜测完成类型),则需要实际调用 Tab 键按下(或等效项),您可以使用脚本来执行此操作expect。这也是正确调用您可能定义的任何自定义完成函数的唯一方法。例如,请参阅 bash-completion 处理其测试套件的方式。
下面是我尝试用一个expect脚本来打印 bash 对任意命令输入建议的完成结果:
system(\'bash\', \'-c\', \'compgen -c -- "$1"\', \'bash\', \'xa\')\n# xargs\n# xattr\n# etc\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n调用./script.exp string将打印出 bash 将为 生成的实际完成结果string,每行一个。如果没有建议完成,则不会打印任何内容。