A festa de one-liner para mudar para o diretório onde algum arquivo está localizado
Pergunta
Muitas vezes eu quero mudar para o diretório onde um executável específico está localizado. Então, eu gostaria algo como
cd `which python`
para mudar para o diretório onde o comando python está instalado. No entanto, este é obviamente ilegal, desde cd leva um diretório, não um arquivo. Há obviamente alguns regexp-foo eu poderia fazer para retirar o nome do arquivo, mas isso iria contra o ponto de ser um one-liner fácil.
Solução
Aqui:
cd $(dirname `which python`)
Editar:
mais fácil Mesmo (realmente testado neste momento):
function cdfoo() { cd $(dirname `which $@`); }
Em seguida, "cdfoo python".
Outras dicas
Para evitar todos esses programas externos ( 'dirname' e muito pior, o inútil, mas popular 'que') talvez um pouco reescrito:
cdfoo() {
tgtbin=$(type -P "$1")
[[ $? != 0 ]] && {
echo "Error: '$1' not found in PATH" >&2
return 1
}
cd "${tgtbin%/*}"
}
Este também corrige a palavra-chave incomum 'função' de cima e acrescenta (muito simples) o tratamento de erros.
Pode ser um começo para uma solução mais sphisticated.
Para comparação:
zsh:~% cd =vi(:h) zsh:/usr/bin%
= cmd expande-se para o caminho para cmd e (: h) é um modificador glob para tirar a cabeça
zsh é somente gravação, mas poderosa.
algo como isso deve fazer o truque:
cd `dirname $(which python)`
Uma característica que eu usei allot é pushd / popd. Estes mantêm uma pilha de diretórios de modo que você não tem que tentar manter a história de onde você estava, se você quiser voltar para o diretório de trabalho atual antes de alterar diretórios.
Por exemplo:
pushd $(dirname `which $@`)
...
popd
Você pode usar algo como isto:
cd `which <file> | xargs dirname`
Eu adicionei um pouco de manipulação de erro simples que faz com que o comportamento dos cdfoo () siga a de dirname para argumentos inexistente / nonpath
function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}