Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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
Shell 别名";cd";这样它将自动完成并尝试移动到目录_Shell_Unix_Scripting_Alias_Cd - Fatal编程技术网

Shell 别名";cd";这样它将自动完成并尝试移动到目录

Shell 别名";cd";这样它将自动完成并尝试移动到目录,shell,unix,scripting,alias,cd,Shell,Unix,Scripting,Alias,Cd,我想知道是否有人能做到这一点。假设我有这个文件夹结构: Folder A Folder Apple Folder Orange 如果我当前在文件夹A中,我希望这样,如果我键入“cd Ap”并按enter键,它会自动将我放入“Apple”子文件夹。从本质上讲,它将尝试根据部分输入自动完成并打开文件夹 如果我当前在文件夹A中,键入“cd ap”并按enter键(小写字母“A”),我会收到一个错误,因为它无法自动完成实际的子文件夹名称。这可能吗?我在科恩工作。我不太想回答你的问题,但

我想知道是否有人能做到这一点。假设我有这个文件夹结构:

Folder A
    Folder Apple
    Folder Orange
如果我当前在文件夹A中,我希望这样,如果我键入“cd Ap”并按enter键,它会自动将我放入“Apple”子文件夹。从本质上讲,它将尝试根据部分输入自动完成并打开文件夹


如果我当前在文件夹A中,键入“cd ap”并按enter键(小写字母“A”),我会收到一个错误,因为它无法自动完成实际的子文件夹名称。这可能吗?我在科恩工作。

我不太想回答你的问题,但我会接近你的。在我看来,按tab键并不是你的障碍,而是资本化。我知道这种感觉,就像是在camelCase和不方便的打字之间做出选择

抱歉,我只是在巴什做的。如果我还记得的话,bash和ksh非常接近,所以我希望它能对您起作用

set completion ignore case on
在bash中启用不区分大小写的补全。当然,这会进入任何你想要的启动脚本中


祝你好运,告诉我们它在ksh是否有效

我不太想回答你的问题,但我会接近你的。在我看来,按tab键并不是你的障碍,而是资本化。我知道这种感觉,就像是在camelCase和不方便的打字之间做出选择

抱歉,我只是在巴什做的。如果我还记得的话,bash和ksh非常接近,所以我希望它能对您起作用

set completion ignore case on
在bash中启用不区分大小写的补全。当然,这会进入任何你想要的启动脚本中

祝你好运,告诉我们它在ksh是否有效

这里有一个ksh函数(未测试)

使用ksh,Esc\相当于bash选项卡完成。

这里有一个ksh函数(未测试)


对于ksh,Esc\相当于bash选项卡的完成。

对于bash,您可以将以下内容添加到
~/.bashrc
中。默认情况下,它将进行不区分大小写的匹配。它有点长,但它应该可以处理您向它抛出的任何内容(除了尝试从符号链接目录自动完成
cd../my_direc
(有关详细信息,请参阅)

如果您使用此脚本并将其保留为不区分大小写,那么您还可以将
bind“set completion ignore case on”
添加到
~/.bashrc
中,以便制表符完成也不区分大小写

cd() {
    # Attempts to autocomplete the directory name
    #
    # If it fails to find a match, it'll still execute the input, in case the argument was
    # something like "-".
    case_insens=1 # set to one if you want it to try case-insensitive matching

    # for exact matches, cd immediately
    if [ -d "$1" ]; then
        builtin cd "$1"
        return
    fi
    # deal with no arguments passed
    if [ $# -eq 0 ]; then
        builtin cd
        return
    fi

    # first loop for case-sensitive (since we prefer a case-sensitive match)
    # for more on this globbing, see: bit.ly/1CZ9qym
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do
        # skip if this result is not a directory
        [ -d "$element" ] || continue

        if [[ "$(basename "$element")" == "$(basename "$1")"* ]]; then
            # if there's no ambiguity, switch to that folder
            if [ $(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null | wc -l) -gt 1 ]; then
                echo "'$1' matches multiple results:  "
                echo "$(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null)" 
                # try to cd anyway
                builtin cd "$1" &> /dev/null 
                unset case_insens element
                return
            else
                builtin cd "$element"
                unset case_insens element
                return              
            fi
        fi
    done

    if [ $case_insens -eq 1 ]; then
        #case-insensitive argument
        ci_arg="${1,,}"
    else
        builtin cd "$1"
        unset case_insens element
        return
    fi

    #Case-insensitive loop
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do
        # skip if this result is not a directory
        [ -d "$element" ] || continue   

        ci_element_name="$(basename "${element,,}")"
        if [[ "$ci_element_name" == "$(basename "$ci_arg")"* ]]; then
            # if there's no ambiguity, switch to that folder
            if [ $(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null | wc -l) -gt 1 ]; then
                echo "'$ci_arg' matches multiple results:  "
                echo "$(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null)"
                # try to cd anyway
                builtin cd "$1" &> /dev/null
                unset ci_arg case_insens ci_element element
                return
            else
                builtin cd "$element"
                unset ci_arg case_insens ci_element element
                return
            fi
        fi
    done
    # we still haven't found a match, so pass the (faulty) argument to the cd command
    builtin cd "$1"
    unset ci_arg case_insens ci_element element
}
示例用法
对于Bash,您可以将以下内容添加到
~/.bashrc
中。默认情况下,它将进行不区分大小写的匹配。它有点长,但它应该能够处理您向它抛出的任何内容(除了尝试从符号链接目录自动完成
cd../my_direc

如果您使用此脚本并将其保留为不区分大小写,那么您还可以将
bind“set completion ignore case on”
添加到
~/.bashrc
中,以便制表符完成也不区分大小写

cd() {
    # Attempts to autocomplete the directory name
    #
    # If it fails to find a match, it'll still execute the input, in case the argument was
    # something like "-".
    case_insens=1 # set to one if you want it to try case-insensitive matching

    # for exact matches, cd immediately
    if [ -d "$1" ]; then
        builtin cd "$1"
        return
    fi
    # deal with no arguments passed
    if [ $# -eq 0 ]; then
        builtin cd
        return
    fi

    # first loop for case-sensitive (since we prefer a case-sensitive match)
    # for more on this globbing, see: bit.ly/1CZ9qym
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do
        # skip if this result is not a directory
        [ -d "$element" ] || continue

        if [[ "$(basename "$element")" == "$(basename "$1")"* ]]; then
            # if there's no ambiguity, switch to that folder
            if [ $(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null | wc -l) -gt 1 ]; then
                echo "'$1' matches multiple results:  "
                echo "$(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null)" 
                # try to cd anyway
                builtin cd "$1" &> /dev/null 
                unset case_insens element
                return
            else
                builtin cd "$element"
                unset case_insens element
                return              
            fi
        fi
    done

    if [ $case_insens -eq 1 ]; then
        #case-insensitive argument
        ci_arg="${1,,}"
    else
        builtin cd "$1"
        unset case_insens element
        return
    fi

    #Case-insensitive loop
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do
        # skip if this result is not a directory
        [ -d "$element" ] || continue   

        ci_element_name="$(basename "${element,,}")"
        if [[ "$ci_element_name" == "$(basename "$ci_arg")"* ]]; then
            # if there's no ambiguity, switch to that folder
            if [ $(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null | wc -l) -gt 1 ]; then
                echo "'$ci_arg' matches multiple results:  "
                echo "$(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null)"
                # try to cd anyway
                builtin cd "$1" &> /dev/null
                unset ci_arg case_insens ci_element element
                return
            else
                builtin cd "$element"
                unset ci_arg case_insens ci_element element
                return
            fi
        fi
    done
    # we still haven't found a match, so pass the (faulty) argument to the cd command
    builtin cd "$1"
    unset ci_arg case_insens ci_element element
}
示例用法
似乎会有很多意想不到的后果。点击TAB来完成有什么不对?Korn不支持TAB完成吗?如果还有一个“杏子”,你想怎么做目录?@Cfreak问得好;这只是一个小小的方便。我当然可以不用它,但每次我想自动完成目录并输入它时,按ESC或任何其他键都会比较慢。它的功能基本上就像我试图手动自动完成它并手动将cd刻录到其中一样,只是它是自动的ed.我理解这是否超出了它的价值。:PSeems喜欢这样做会产生许多意想不到的后果。点击TAB来完成有什么不对?Korn不支持TAB完成吗?如果还有一个“杏子”,你想做什么目录?@Cfreak问得好;这只是一个小小的方便。我当然可以不用它,但每次我想自动完成目录并输入它时,按ESC或任何其他键都会比较慢。它的功能基本上就像我试图手动自动完成它并手动将cd刻录到其中一样,只是它是自动的ed.我理解这是否超出了它的价值。:PThanks glenn;不幸的是,它给了我一个“受限:cd是一个shell内置”。我感谢代码!谢谢glenn;不幸的是,它给了我一个“受限:cd是一个shell内置”不过,我很欣赏代码!不幸的是,它似乎不起作用,但无论如何谢谢你的回复!我可能会考虑切换到BASH;我听说它还是比较好的。P@Carlin:很抱歉听到它在ksh不起作用。这是我适应系统时首先要做的事情之一。啊,不幸的是,它似乎不起作用,但感谢您的支持反正回答!我可能会考虑切换到BASH;我听说它还是比较好的。P@Carlin:很抱歉听说它在ksh中不起作用。这是我在进入系统时首先做的事情之一。我知道OP询问了ksh,但我向遇到此问题的所有Bash用户发布此消息。我知道OP询问了ksh,但我将此发布给您r遇到此问题的任何Bash用户。
cd ~
cd deskt