Respostas:
Em zsh
, geralmente faço:
cd /path/to/somefile(:h)
( h
para head
).
Se somefile
for um link simbólico, você também pode:
cd somefile(:A:h)
Para chegar ao diretório em que o destino do link simbólico pode ser encontrado.
O zsh
equivalente à bash
solução agora única de Chris seria:
cd() {
[[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
builtin cd "$@"
}
Em zsh
, você também pode redefinir o que "palavras" Ctrl-Wremove.
Em zsh
, "palavras" no contexto dos widgets motion / transpose / delete baseados em palavras são sequências de alnums mais os caracteres na $WORDCHARS
variável que, por padrão, inclui /
.
Você pode remover /
de $WORDCHARS
modo que Ctrl-Wexclui apenas um componente caminho:
WORDCHARS=${WORDCHARS/\/}
Outra extensão útil é o select-word-style
widget que você pode usar para escolher interativamente entre diferentes estilos de palavras.
autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style
Em seguida, pressionar Alt-Wpermite escolher entre diferentes estilos de palavras.
$ 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
e estilos de palavras. Obrigado também pelo zsh
comando. Faz o trabalho perfeitamente.
Presumo que você ainda deseja manter a funcionalidade original se inserir um diretório e estiver usando bash
.
cd() {
local file="${!#}"
if (( "$#" )) && ! [[ -d "$file" ]]; then
builtin cd "${@:1:($#-1)}" "${file%/*}"
else
builtin cd "$@"
fi
}
Se você nunca usará as opções do CD ( -P
, etc), isso também será suficiente:
cd() {
if [ -d "$1" ] || [ -z "$1" ]; then
builtin cd "$@"
else
builtin cd "${1%/*}"
fi
}
builtin
na frente das cd
chamadas
cd
opções não funciona zsh
. O mais simples funciona bem zsh
, MAS cd
não é mais equivalente a cd ~
: /
[ -z "$1" ]
foi suficiente. Aceitei a resposta de Stephane para lhe dar mais visibilidade, pois parece ser a melhor solução zsh
.
Você pode usar dirname
para remover o nome do arquivo do caminho, por exemplo
mycd() { cd "$(dirname "$1")"; }
Veja man dirname
.
Se você adicionar isso ao seu .profile
, carregue-o ( source ~/.profile
ou efetue logout e logon novamente) e mycd [file or directory]
o levará ao diretório certo:
mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }
Se você escolher cd
, coisas estranhas acontecerão.
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 função pode reiniciar o sistema. Além disso, o usuário está usando zsh
, não bash
.
cd '$(sudo reboot)'
alteraria o diretório, enquanto sua função tentaria avaliar o nome.