键入时cd ~foo
,我希望bash将我带到某个目录,foo
作为键入的完整目录路径的快捷方式foo
。并且我希望能够cp ~foo/bar.txt ~/bar.txt
将文件从/foo/
目录复制到主目录...因此,基本上,我想要的功能与之完全相同~/
,但是我指定了目录的位置。[我确定我应该jfgi,但我不知道该怎么做]
键入时cd ~foo
,我希望bash将我带到某个目录,foo
作为键入的完整目录路径的快捷方式foo
。并且我希望能够cp ~foo/bar.txt ~/bar.txt
将文件从/foo/
目录复制到主目录...因此,基本上,我想要的功能与之完全相同~/
,但是我指定了目录的位置。[我确定我应该jfgi,但我不知道该怎么做]
Answers:
我过去这样做的方法是创建一个目录,该目录包含指向您想要快捷方式执行的目录的符号链接,并将该目录添加到您的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"
您可以为其编写包装函数,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
用bash:
~foo
为用户foo的主目录保留。我不建议仅仅为了方便而创建用户。
通过设置环境变量(在中查找),可以在更改目录时使生活更轻松(或更艰难)。CDPATH
bash(1)
除此之外,唯一想到的方法是为您要缩写的目录设置环境变量。
$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR
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
}
我有以下功能,可以动态创建别名,
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中。这适用于任何外壳。