Respuestas:
En zsh
, a menudo hago:
cd /path/to/somefile(:h)
( h
para head
).
Si somefile
es un enlace simbólico, también puede hacer:
cd somefile(:A:h)
Para llegar al directorio donde se puede encontrar el destino del enlace simbólico.
El zsh
equivalente de la bash
única solución de Chris ahora sería:
cd() {
[[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
builtin cd "$@"
}
En zsh
, también puedes redefinir lo que las "palabras" Ctrl-Weliminan.
En zsh
, "palabras" en el contexto de los widgets de movimiento / transposición / eliminación basados en palabras son secuencias de alnums más los caracteres en la $WORDCHARS
variable que por defecto incluye /
.
Puede eliminar /
de $WORDCHARS
modo que Ctrl-Wsolo elimine un componente de ruta:
WORDCHARS=${WORDCHARS/\/}
Otra extensión útil es el select-word-style
widget que puede usar para elegir interactivamente entre diferentes estilos de palabras.
autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style
Luego, presionar le Alt-Wpermite elegir entre diferentes estilos de palabras.
$ 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
y los estilos de palabras. Gracias también por el zsh
comando. Hace el trabajo perfectamente.
Supongo que aún desea conservar la funcionalidad original si ingresa un directorio y lo está utilizando bash
.
cd() {
local file="${!#}"
if (( "$#" )) && ! [[ -d "$file" ]]; then
builtin cd "${@:1:($#-1)}" "${file%/*}"
else
builtin cd "$@"
fi
}
Si nunca va a utilizar las opciones de CD ( -P
, etc.), esto también será suficiente:
cd() {
if [ -d "$1" ] || [ -z "$1" ]; then
builtin cd "$@"
else
builtin cd "${1%/*}"
fi
}
builtin
en frente de las cd
llamadas
cd
opciones no funciona zsh
. El más simple funciona bien zsh
, PERO cd
ya no es equivalente a cd ~
: /
[ -z "$1" ]
fue suficiente. Acepté la respuesta de Stephane para darle más visibilidad, ya que parece ser la mejor solución zsh
.
Puede usar dirname
para quitar el nombre de archivo de la ruta, p. Ej.
mycd() { cd "$(dirname "$1")"; }
Ver man dirname
.
Si agrega esto a su .profile
, luego lo carga ( source ~/.profile
o cierra sesión y vuelve a iniciar sesión), mycd [file or directory]
lo llevará al directorio correcto:
mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }
Si lo nombra cd
, entonces sucederán cosas extrañas.
zsh
.
cd
, como -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)
, esta función puede reiniciar el sistema. Además, el usuario está utilizando zsh
, no bash
.
cd '$(sudo reboot)'
cambiaría el directorio, mientras que su función intentaría evaluar el nombre.