bash 目录快捷方式

Sea*_*mus 32 bash

当我键入 时cd ~foo,我希望 bash 将我带到某个目录foo作为键入foo. 我希望能够cp ~foo/bar.txt ~/bar.txt将文件从/foo/目录复制到主目录......所以基本上,我想要一些完全一样的东西~/,但我指定目录应该是什么。[我确定我应该jfgi,但我不知道该fg]

Mic*_*zek 43

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

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin
Run Code Online (Sandbox Code Playgroud)

当然,缺点是如果当前目录中有一个名为“b”的目录,它就不起作用——它优先于 CDPATH


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

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"
Run Code Online (Sandbox Code Playgroud)

  • 此 ZSH 功能在哪些方面与此不同: echo hi> /tmp/test;export t=/tmp; cat $t/test 至少在我的机器上,这工作得很好。唯一的区别是您必须键入的字符。 (2认同)
  • @Steven它非常相似,但ZSH知道在这种情况下它是一个命名目录,因此它可以在提示扩展和shell内置命令中特别对待它 (2认同)

Den*_*son 11

您可以为其编写一个包装函数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
Run Code Online (Sandbox Code Playgroud)


小智 7

使用 bash:

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

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

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

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR
Run Code Online (Sandbox Code Playgroud)