我在办公室使用Cshell,它似乎没有反向增量搜索历史记录.是否有任何方法可以reverse-i-search在cshell中启用(如bash中的那个).
谢谢.
有一种方法可以在bash中运行命令,如下所示:
echo ls | bash
Run Code Online (Sandbox Code Playgroud)
我需要对bash完成进行单元测试,如果有一种方法可以通过这种方式将按钮传递给Tab以完成命令,那我就很烦人了,如下所示:
# This doesn't work, but I think you get the idea
echo chromi$'\t' | bash
Run Code Online (Sandbox Code Playgroud)
那可能吗?或者也许你可以建议另一种单元测试bash完成的方法?
能够进入dev my-[tab]我系统上的任何地方并接收自动完成,例如
$ dev my-[tab]
my-project
my-awesome-project
Run Code Online (Sandbox Code Playgroud)
我创建了一个包含/etc/bash_completion.d/以下内容的文件:
_dev()
{
PROJECTS=$(ls /development)
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _dev dev
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我也希望能够自动完成子文件夹:
[~] $ dev my-p[tab]
[~] $ dev my-project/[tab][tab]
src doc
[~] $ dev my-project/s[tab][enter]
[/development/my-project/src] $
Run Code Online (Sandbox Code Playgroud)
所以基本上,我希望以dev与cd.
dev 只是一个别名:
alias dev='gotodev'
gotodev ()
{
cd /development/$1
}
Run Code Online (Sandbox Code Playgroud) 在实际问题之前,先简单介绍一下我正在做什么来理解这个想法。
我想为我的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键时。我认为最好将其从当前问题的范围中排除。
我正在为我是维护者的项目进行 bash 自动完成。您可以在此处找到该脚本。我自己拼凑了一些黑客技术,并在一些比我更了解完成 API 的贡献者的帮助下完成了这项工作。
我们拥有的东西很好用——只有一个例外。我们可以像这样管理完成
//type
pestle.phar som[TAB]
//completes to
pestle.phar some-command-name
Run Code Online (Sandbox Code Playgroud)
然而,一旦我们到达这里,我们就会丢失文件路径/名称补全,它是股票 bash shell 的一部分。也就是说,处理上一个示例,如果用户键入
//type
pestle.phar some-command-name /va[TAB]
Run Code Online (Sandbox Code Playgroud)
我们希望它完成
//completes to the following, because var exists
pestle.phar some-command-name /var
Run Code Online (Sandbox Code Playgroud)
有没有办法只告诉complete命令类似
嘿,除了我们告诉您使用自定义 bash 函数执行的所有操作之外,还要保持正常的文件路径完成
如果没有,是否有一些已知的科学/样板可以在您自己的自定义基本完成功能中重新实现文件路径完成?
其他一些答案和文档 似乎表明-o filenamesor-o bashdefault选项应该解决这个问题——但它似乎不适用于 OS X 10.11。我不确定我是否误解了-o,或者我的完成文件中的代码是否以某种方式覆盖了-o行为,或者如果 OS X 正在这样做,我只是一个表现良好的 unix东西。
另外——如果它不明显——这是我的第一个深度 bash 完成牛仔竞技表演。如果我在上面说了一些看似愚蠢/幼稚的话,请告诉我。我现在可能在寻找一条鱼,但我想学习到鱼在bash补河自己。
我创建了一个命令memo如下:
memo() {
vi $HOME/memo/$1
}
Run Code Online (Sandbox Code Playgroud)
我想将 bash-completion 应用到我memo要打开的目录中的$HOME/memo文件:
$ memo [TAB] # to show files in $HOME/memo
Run Code Online (Sandbox Code Playgroud)
$HOME/memo包含目录,因此列出其下的文件memo是不够的。换句话说,我想将ls命令中使用的内容应用$HOME/memo到memo:
$ ls [TAB]
foo.md bar/
Run Code Online (Sandbox Code Playgroud)
我尝试了以下但它不适用于嵌套目录:
_memo() {
local cur
local files
_get_comp_words_by_ref -n : cur
files=$(ls $MEMODIR)
COMPREPLY=( $(compgen -W "${files}" -- "${cur}") )
}
complete -F _memo memo
Run Code Online (Sandbox Code Playgroud)
MEMODIR=$HOME/memo
有没有办法!$在 shell 内交互式编辑命令时扩展in 命令行?
例如,当我打字时ls !$,我按下了某个按钮,然后我看到了 的值!$。
为了方便我的脚本命令行开关的bash完成,我一直在/ etc/bash_completion(debian sid,bash v4.2-1,bash-completion v1:1.99-3)中探索_parse_help函数.
我的脚本生成一个帮助消息,我认为是标准的GNU格式:
MYSCRIPT [OPTIONS]
Usage:
-h, --help Show this help message
-o, --option Some option
Run Code Online (Sandbox Code Playgroud)
然后我通过激活完成complete -F _parse_help ./myscript.
不幸的是,这并没有产生预期的结果.在第一个选项卡上./myscript <TAB>(注意,只需一个按键),将显示一个未格式化的列表,其中包含--help和--option,而不是缩短的版本.更糟糕的是,任一选项的完成都失败了.实际上,只需键入短划线就会导致_parse_help完全停止生成输出.
整个事情感觉非常破碎,我在网上找不到太多的参考.这个功能可能被认为是过时的吗?是否有另一种基于解析的命令行完成的标准方法--help输出?
bash command-line-arguments command-line-parsing bash-completion
我是新手compgen,想将它用于我正在编写的脚本。该脚本可以将“命令”和“选项”作为参数,如下所示:
script add "value"
script --path "/a/file/path" add "value"
# and others
Run Code Online (Sandbox Code Playgroud)
我写了一个完成脚本,如下所示:
_script_completions() {
arg_index="${COMP_CWORD}"
if [[ "${arg_index}" -eq 1 ]]; then
COMPREPLY=($(compgen -W "--path add" "${COMP_WORDS[1]}"))
fi
}
complete -F _script_completions script
Run Code Online (Sandbox Code Playgroud)
该脚本对于“add”命令运行良好,但在“--path”选项上失败。例如:当我输入:
$ script --p<TAB>
Run Code Online (Sandbox Code Playgroud)
我得到:
$ ./script --pbash: compgen: --: invalid option
compgen: usage: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
Run Code Online (Sandbox Code Playgroud)
如何正确添加我自己的脚本选项的补全?
我正在编写一个 bash 命令行工具,我想使用完全启用 bash 完成。
我有以下 bash 完成。在我eval "$(./cli completion)"(输出以下内容)之后,补全在 bash 中工作正常:
#!/usr/bin/env bash
# This bash completions script was generated by
# completely (https://github.com/dannyben/completely)
# Modifying it manually is not recommended
_cli_completions() {
local cur=${COMP_WORDS[COMP_CWORD]}
local comp_line="${COMP_WORDS[*]:1}"
case "$comp_line" in
'completions'*) COMPREPLY=($(compgen -W "--help -h" -- "$cur")) ;;
'download'*) COMPREPLY=($(compgen -W "--force --help -f -h" -- "$cur")) ;;
''*) COMPREPLY=($(compgen -W "--help --version -h -v completions download" -- "$cur")) ;;
esac
}
complete -F _cli_completions …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何在bash脚本中创建动态case语句。
例如,假设我有以下内容的awk语句的输出
red
green
blue
Run Code Online (Sandbox Code Playgroud)
在这种情况下,输出可以随时更改。
如果此awk输出中包含值,则我尝试执行不同的逻辑。
因此,如果上面的数据在$ list中,那么我在概念上想做类似的事情:
case "${my_var}" in
$list)
.....
something_else)
.....
esac
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用它来构建动态的自定义标签完成功能(有关某些背景,请参见http://www.debian-administration.org/article/An_introduction_to_bash_completion_part_2)。
有任何想法吗?
谢谢。
我有一个~/builds包含以下子目录的文件夹:
> tree ~/builds
~/builds
??? projectA
? ??? build_2020_04_10_ok
? ??? build_2020_04_11_ko
? ??? build_2020_04_12_ok
? ??? ...
??? projectB
??? build_2020_04_10_ok
??? build_2020_04_11_ok
??? build_2020_04_12_ok
??? ...
Run Code Online (Sandbox Code Playgroud)
目前,当我编写一个将子文件夹之一作为参数的命令并使用自动完成功能时,会bash列出所有候选:
> mycmd ~/builds/projectA/[TAB]
> mycmd ~/builds/projectA/build_2020_04_1[TAB][TAB]
build_2020_04_10_ok build_2020_04_11_ko build_2020_04_12_ok ...
Run Code Online (Sandbox Code Playgroud)
那不是我想要的行为。
我想要的更像是类似 Windows 的自动完成。我知道我可以通过修改我的.bashrc方式来使用它:
bind '"\C-g": menu-complete'
Run Code Online (Sandbox Code Playgroud)
现在,当我按下时会发生以下情况Ctrl+g:
> mycmd ~/builds/projectA/[Ctrl+g]
> mycmd ~/builds/projectA/build_2020_04_10_ok[Ctrl+g]
> mycmd ~/builds/projectA/build_2020_04_11_ko[Ctrl+g]
> mycmd ~/builds/projectA/build_2020_04_12_ok
Run Code Online (Sandbox Code Playgroud)
这几乎就是我想要的。我想更改子文件夹出现的顺序(首先是最新的,然后是旧的)。另外,我想丢弃所有ko构建。换句话说,我想要这个命令定义的顺序:
ls -dr build*ok
build_2020_04_12_ok/ build_2020_04_10_ok/
Run Code Online (Sandbox Code Playgroud)
因此,我想定义一个完成规范,menu-complete以便仅在~/builds …