标签: bash-completion

如何更改bash历史记录完成以完成已在线上的操作?

几个月前我发现了一个命令,当按下向上箭头时,我的bash历史记录会自动完成已经在线上的命令:

$ vim fi
Run Code Online (Sandbox Code Playgroud)

$ vim file.py
Run Code Online (Sandbox Code Playgroud)

我想在我的新电脑上设置它,因为它可以节省大量的时间来保持一个伟大的历史.问题是,我不能为我的生活记住它被提到的地方,阅读无尽的bash参考和教程不幸也没有帮助.

有人知道命令吗?

linux bash shell bash-completion

129
推荐指数
2
解决办法
4万
查看次数

在Bash完成的上下文中关于$ {array [*]}与$ {array [@]}的混淆

我正在尝试第一次编写Bash完成,我对解除引用Bash数组(${array[@]}${array[*]})的两种方法感到困惑.

这是相关的代码块(顺便说一句,它可以工作,但我想更好地理解它):

_switch()
{
    local cur perls
    local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew}
    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    perls=($ROOT/perls/perl-*)
    # remove all but the final part of the name
    perls=(${perls[*]##*/})

    COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) )
}
Run Code Online (Sandbox Code Playgroud)

Bash的文档说:

可以使用$ {name [subscript]}引用数组的任何元素.需要大括号以避免与shell的文件名扩展运算符冲突.如果下标是'@'或'*',则该单词将扩展为数组名称的所有成员.这些下标仅在单词出现在双引号内时有所不同.如果单词是双引号,则$ {name [*]}扩展为单个单词,每个数组成员的值由IFS变量的第一个字符分隔,$ {name [@]}扩展名称的每个元素一个单独的词.

现在我想我明白,compgen -W期望一个字符串包含可能的替代词列表,但在这种情况下,我不明白"$ {name [@]}将名称的每个元素扩展为单独的词"是指.

长话短说:${array[*]}作品; ${array[@]}没有.我想知道为什么,我想更好地理解究竟是什么${array[@]}扩展到了什么.

arrays bash bash-completion

73
推荐指数
2
解决办法
3万
查看次数

在后台运行bash命令而不打印作业和进程ID

在bash中在后台运行进程非常简单.

$ echo "Hello I'm a background task" &
[1] 2076
Hello I'm a background task
[1]+  Done                    echo "Hello I'm a background task"
Run Code Online (Sandbox Code Playgroud)

但输出结果很冗长.在第一行打印后台任务的作业ID和进程ID,然后我们输出命令,最后我们有作业ID,它的状态和触发作业的命令.

有没有办法抑制运行后台任务的输出,使输出看起来与没有前后的&符号完全一样?即:

$ echo "Hello I'm a background task" &
Hello I'm a background task
Run Code Online (Sandbox Code Playgroud)

我问的原因是我想运行后台进程作为tab-completion命令的一部分,因此该命令的输出必须不间断才有意义.

bash bash-completion

64
推荐指数
6
解决办法
3万
查看次数

Python argparse和bash完成

我想在我的python脚本中也可以在参数中自动完成.

我从来没有真正理解bash_completion是如何工作的(对于参数),但是在我深入了解之后我明白了:

  1. 它使用"完成"将完成函数绑定到命令
  2. 每个完成函数基本上都是参数解析器的副本

第二点尤其不是很好,因为我想让它自动生成.

最好的事情是shell会在每个TAB上向我的程序询问要完成什么,但我的印象是这不能真正起作用,这是正确的吗?

第二个选项可能只是将一个转换器从argparse解析器写入一个正确完成的shell函数.

python argparse bash-completion

54
推荐指数
2
解决办法
2万
查看次数

bash完成makefile目标

假设我有一个简单的makefile,如:

hello:
   echo "hello world"

bye:
   echo "bye bye"
Run Code Online (Sandbox Code Playgroud)

然后在bash我想要的东西:

make h <tab>

所以它可以完成

打招呼

我发现了一种简单的方法,比如创建空文件hello,bye但我正在寻找更复杂的东西.

makefile bash-completion

43
推荐指数
3
解决办法
2万
查看次数

在Bash脚本中调用READ时获取自动完成功能

在我的Bash脚本中,我正在阅读用户使用READ输入的一些变量:

read -p "Glassfish Path:" GF_DIR
Run Code Online (Sandbox Code Playgroud)

现在我希望用户在必须进入目录时获得自动完成功能,就像你在Bash shell上一样.所以当他输入目录的第一个字母时,他可以通过点击TAB自动填充它.那可能吗?

bash bash-completion

35
推荐指数
1
解决办法
1万
查看次数

Cygwin git tab完成

我在Windows上安装了Cygwin,其中一个默认包是git tab completion,但我没有tab完成.

我做了一些搜索并找到了一条说明默认情况下未启用的说明.我复制了skel .bashrc and .bash_profile to ~ and in .bashrc我取消注释完成的行,然后重新启动控制台.依然没有.

然后我注意到文件.bash_completion没有出现/etc,所以我在网上发现了一个副本并把它放到位,但我仍然没有在git中完成.

它似乎也应该有一个/etc/bash_completion.d目录git/,但我也没有.

bash cygwin bash-completion

32
推荐指数
5
解决办法
1万
查看次数

bash和readline:用户输入循环中的制表符完成?

我正在制作一个向用户提供命令行的bash脚本.

cli代码是这样的:

#!/bin/bash

cmd1() {
    echo $FUNCNAME: "$@"
}

cmd2() {
    echo $FUNCNAME: "$@"
}

cmdN() {
    echo $FUNCNAME: "$@"
}

__complete() {
    echo $allowed_commands
}

shopt -qs extglob

fn_hide_prefix='__'
allowed_commands="$(declare -f | sed -ne '/^'$fn_hide_prefix'.* ()/!s/ ().*//p' | tr '\n' ' ')"

complete -D -W "this should output these words when you hit TAB"

echo "waiting for commands"
while read -ep"-> "; do
    history -s $REPLY
    case "$REPLY" in
        @(${allowed_commands// /|})?(+([[:space:]])*)) $REPLY ;;
        \?) __complete ;;
        *) echo "invalid …
Run Code Online (Sandbox Code Playgroud)

bash bash-completion

31
推荐指数
3
解决办法
1万
查看次数

选项卡上的Bash变量扩展完成

我正在运行Ubuntu 11.04,当我尝试在以变量开头的路径上使用bash中的tab-completion时,我会看到一些奇怪的行为.如果我有TOP =/scratch,我尝试tab-complete:

cd $ TOP/foo

它变为:

cd\$ TOP/foo

我更喜欢它完成:cd $ TOP/foobar或cd/scratch/foobar但我会满足于它只是不改变线并要求我取消$.

有谁知道bash/readline在哪里我应该解决这个问题?

bash readline bash-completion

29
推荐指数
2
解决办法
8344
查看次数

Bash完成:在别名完成中荣获特定于存储库的Git别名

假设bash配置了以下别名:

alias up="git --git-dir /path/to/backup/.git"

而那个特定的存储库 - 只有该存储库 - 具有以下git别名:

[alias]
backup = commit --allow-empty-message
Run Code Online (Sandbox Code Playgroud)

怎么能up自动完成backup


这自动完成backup但不是up:

cd /a/different/dir
git --git-dir=/path/to/backup/.git ba
Run Code Online (Sandbox Code Playgroud)

这是up使用标准git命令自动完成但不是backup:

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up


编辑:Etan是对的,完成功能需要查看扩展的别名,所以我创建了以下内容:

CompletableAlias() {
    if (($#<2)); then
        return 1
    fi
    source_c="$1"
    target_c="$2"
    target_a=( "${@:2}" )
    target_s="${target_a[*]}"
    alias "${source_c}=${target_s}"
    completion_modifier="__${source_c}_completion"
    completion_original="$( complete -p "$target_c" 2>/dev/null |
                            sed 's/.*-F\W\+\(\w\+\).*/\1/'
                          )"
    if [[ -n "$completion_original" ]]; then
        read …
Run Code Online (Sandbox Code Playgroud)

git bash bash-completion

29
推荐指数
1
解决办法
650
查看次数

标签 统计

bash-completion ×10

bash ×8

argparse ×1

arrays ×1

cygwin ×1

git ×1

linux ×1

makefile ×1

python ×1

readline ×1

shell ×1