Answers:
在中zsh
,我经常这样做:
cd /path/to/somefile(:h)
(h
用于head
)。
如果somefile
是符号链接,则还可以执行以下操作:
cd somefile(:A:h)
进入可能找到符号链接目标的目录。
在zsh
克里斯的相当于现在bash
-only的解决办法是:
cd() {
[[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
builtin cd "$@"
}
在中zsh
,您还可以重新定义Ctrl-W删除“单词”的内容。
在中zsh
,基于单词的运动/转置/删除小部件中的“单词”是数字序列加上$WORDCHARS
变量中的字符(默认情况下包括)/
。
您可以/
从中删除,$WORDCHARS
以便Ctrl-W仅删除一个路径组件:
WORDCHARS=${WORDCHARS/\/}
另一个有用的扩展是select-word-style
小部件,您可以使用该小部件在不同的文字样式之间进行交互选择。
autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style
然后按Alt-W允许您在不同的文字样式之间进行选择。
$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?
zsh
和字样式的功能非常有趣的编辑。也感谢您的zsh
命令。它完美地完成了工作。
我假设如果您输入目录,并且仍在使用,您仍然希望保留其原始功能bash
。
cd() {
local file="${!#}"
if (( "$#" )) && ! [[ -d "$file" ]]; then
builtin cd "${@:1:($#-1)}" "${file%/*}"
else
builtin cd "$@"
fi
}
如果您永远不会使用cd的选项(-P
,等等),那么这也足够了:
cd() {
if [ -d "$1" ] || [ -z "$1" ]; then
builtin cd "$@"
else
builtin cd "${1%/*}"
fi
}
builtin
在cd
调用之前添加
cd
选项的版本不适用于zsh
。比较简单的一个工作正常zsh
,但cd
已不再等同cd ~
:/
[ -z "$1" ]
足够了。我已接受Stephane的回答以使其更具可见性,因为这似乎是的最佳解决方案zsh
。
您可以用来dirname
从路径中删除文件名,例如
mycd() { cd "$(dirname "$1")"; }
请参阅man dirname
。
如果将其添加到.profile
,然后加载(source ~/.profile
或注销并再次登录),mycd [file or directory]
则将您带到正确的目录:
mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }
如果您命名cd
,那么将会发生奇怪的事情。
zsh
。
cd
,则也会中断-P
。
cd2() {
arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'
while [ "$#" -gt 1 ] ; do
case "$1" in
-h) printf "%s: cd2 %s\n" "$0" "$msg"
return 1 ;;
*) arg+=("$1") ;;
esac
shift
done
[ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
[ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"
if ! $cmd 2>/dev/null; then
printf "%s: cd2 %s\n" "$0" "$msg"
return 1
fi
}
$(sudo reboot)
,此功能可能会重新引导系统。此外,用户正在使用zsh
,而不是bash
。
cd '$(sudo reboot)'
将更改目录,而您的函数将尝试评估名称。