bash目录快捷方式


28

键入时cd ~foo,我希望bash将我带到某个目录,foo作为键入的完整目录路径的快捷方式foo。并且我希望能够cp ~foo/bar.txt ~/bar.txt将文件从/foo/目录复制到主目录...因此,基本上,我想要的功能与之完全相同~/,但是我指定了目录的位置。[我确定我应该jfgi,但我不知道该怎么做]


zsh对此具有内置支持。它被称为“ 命名目录
Sildoreth 2015年

我一直在寻找一些shell书签工具,但最终我得到了自己的(基于模糊搜索)解决方案,该解决方案比我以前见过的任何其他东西都更加令人高兴。检查以下答案:unix.stackexchange.com/a/209892/46011
德米特里·弗兰克

Answers:


39

我过去这样做的方法是创建一个目录,该目录包含指向您想要快捷方式执行的目录的符号链接,并将该目录添加到您的CDPATH中。CDPATH控制在cd切换目录时将在何处搜索,因此,如果该符号链接目录位于您的CDPATH中,则可以cd立即访问任何符号链接目录:

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

不利的一面是,如果当前目录中存在一个名为“ b”的目录,则该目录不起作用-优先于CDPATH


我通常不喜欢说“首先需要切换外壳”的答案,但是如果您愿意使用ZSH的话,此确切功能就存在于ZSH中。它称为命名目录。导出变量foo,引用~foo时解析为的值$foo。这特别方便,因为它还可以在以下命令中使用cd

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
ZSH功能在哪些方面与这样做有所不同:echo hi> / tmp / test; export t = / tmp; cat $ t / test至少在我的机器上,这很好。唯一的区别是您必须键入字符。
史蒂文D

将op引用到zsh是正确的事情。我已经15年没有错过任何功能了。似乎有些人真的很着迷,而其他人却不在乎。这就是为什么有多个外壳的原因。

2
@Steven这非常相似,但是ZSH知道在这种情况下它是一个命名目录,因此它可以在快速扩展和shell内置命令中特别对待它
Michael Mrozek

[我主要使用emacs Mx shell进行此操作(因为那是在使用终端时),我想这排除了ZSH解决方案] ...
Seamus 2010年

1
将其添加到我的.zshrc中,并且可以正常工作。
Seamus 2010年

10

您可以为其编写包装函数,cd并将其称为“ cd”(最终该函数将调用builtin cd-使用builtin关键字)。您可以使用一个前缀字符,Bash在函数看到该字符之前不会在命令行上展开,并且该前缀字符不太可能在目录名称中显示为初始字符,也许是“:”。您可能希望使其更强大,但是这里有一个简单的概述:

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
这是一个非常好的主意
Michael Mrozek

感谢您的建议-在此基础上提出了一个非常简单的解决方案:aaverin.github.io/unix/macox/2014/05/26/bash-named-folders
AAverin 2015年

7

用bash:

~foo为用户foo的主目录保留。我不建议仅仅为了方便而创建用户。

通过设置环境变量(在中查找),可以在更改目录时使生活更轻松(或更艰难)。CDPATHbash(1)

除此之外,唯一想到的方法是为您要缩写的目录设置环境变量。

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

Bash变量可用于创建书签系统。变量将与任何命令一起使用,bash将制表符以完整显示变量名称。在较新版本的bash中,如果在变量名称后附加/,则变量包含的路径也可以制表符补全。

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

为了保持持久性,可以将变量声明保存在源自.bashrc的文件中。由于此文件是bash脚本,因此它可以包含引用其他变量的声明,例如aur="${HOME}/AUR",或仅在某些主机上运行的声明,if [[ $HOSTNAME == foo ]]; then bar=baz; fi如果您在多个主机和用户之间重用配置文件,则此设置很有用。

以下bash函数(将其添加到.bashrc或从中获取)允许将书签添加到书签文件或从书签文件中删除。它是相当新的,不能保证没有错误。

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

一种方法是为cd创建一个别名,以替换~c为所需的路径。或者只是使用zsh;)


2
是的,我考虑过这样做,就像别名〜c =“ cd / daten / cvs / plugin_root”一样,但这仅对cd有帮助,而命名目录可用于每个命令。
fschmitt


0

我有以下功能,可以动态创建别名,

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

当我要为目录添加书签时,只需键入s dirName。这将创建一个别名,如alias dirName="cd /my/current/directory/;pwd"。所以我只要输入就能回到这个目录dirName。我有一个版本也将其保存到bash_aliases中。这适用于任何外壳。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.