Yanıtlar:
İçinde zsh
sık sık yaparım:
cd /path/to/somefile(:h)
( h
için head
).
Eğer somefile
bir sembolik bağdır, ayrıca yapabilirsiniz:
cd somefile(:A:h)
Simge bağlantısının hedefinin bulunduğu dizine ulaşmak için.
zsh
Chris eşdeğer şimdi bash
-sadece çözüm olacaktır:
cd() {
[[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
builtin cd "$@"
}
'De zsh
, hangi "kelimelerin" Ctrl-Wkaldırılacağını da yeniden tanımlayabilirsiniz .
Olarak zsh
, kelime bazlı hareket / devrik / silme aletler bağlamında "ifadesi" olarak alnums sekansları artı karakterlerdir $WORDCHARS
varsayılan içeren değişken /
.
Sen kaldırmak olabilir /
dan $WORDCHARS
böylece Ctrl-Wyalnızca bir yol bileşenini siler:
WORDCHARS=${WORDCHARS/\/}
Başka bir kullanışlı uzantı, select-word-style
farklı kelime stilleri arasında etkileşimli olarak seçim yapmak için kullanabileceğiniz widget'tır.
autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style
Ardından tuşuna basarak Alt-Wfarklı kelime stilleri arasında seçim yapabilirsiniz.
$ 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
ve kelime stilleri üzerinde çok ilginç bir düzenleme . zsh
Komuta için de teşekkürler . İşi mükemmel yapıyor.
Bir dizin girerseniz ve kullanıyorsanız orijinal işlevselliğini korumak istediğinizi varsayalım bash
.
cd() {
local file="${!#}"
if (( "$#" )) && ! [[ -d "$file" ]]; then
builtin cd "${@:1:($#-1)}" "${file%/*}"
else
builtin cd "$@"
fi
}
Asla cd'nin seçeneklerini ( -P
, vb.) Kullanmayacaksanız, bu da yeterli olacaktır:
cd() {
if [ -d "$1" ] || [ -z "$1" ]; then
builtin cd "$@"
else
builtin cd "${1%/*}"
fi
}
builtin
önüne eklediğinizden emin oluncd
cd
Seçenekleri koruyan sürüm çalışmaz zsh
. Daha basit olan iyi çalışır zsh
, ancak cd
artık şu şekilde eşdeğer değildir cd ~
: /
[ -z "$1" ]
yeterliydi. Stephane'ın en iyi çözüm gibi göründüğü için daha fazla görünürlük sağlamak için cevabını kabul ettim zsh
.
dirname
Dosya adını yoldan ayırmak için kullanabilirsiniz , örn.
mycd() { cd "$(dirname "$1")"; }
Bkz man dirname
.
Bunu kendinize eklerseniz .profile
, yükleyin ( source ~/.profile
veya oturumu kapatın ve tekrar oturum açın), o mycd [file or directory]
zaman sizi doğru dizine götürür:
mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }
Adını verirseniz cd
, garip şeyler olur.
zsh
.
cd
gibi -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)
, bu işlev sistemi yeniden başlatabilir. Ayrıca, kullanıcı kullanıyor zsh
, kullanmıyor bash
.
cd '$(sudo reboot)'
dizini değiştirirken, işleviniz adı değerlendirmeye çalışacaktır.