Respuestas:
En zsh, a menudo hago:
cd /path/to/somefile(:h)
( hpara head).
Si somefilees 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 zshequivalente 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 $WORDCHARSvariable que por defecto incluye /.
Puede eliminar /de $WORDCHARSmodo que Ctrl-Wsolo elimine un componente de ruta:
WORDCHARS=${WORDCHARS/\/}
Otra extensión útil es el select-word-stylewidget 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
?
zshy los estilos de palabras. Gracias también por el zshcomando. 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
}
builtinen frente de las cdllamadas
cdopciones no funciona zsh. El más simple funciona bien zsh, PERO cdya 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 dirnamepara 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 ~/.profileo 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.