A festa de one-liner para mudar para o diretório onde algum arquivo está localizado

StackOverflow https://stackoverflow.com/questions/855616

  •  21-08-2019
  •  | 
  •  

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.

Foi útil?

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 ) ));}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top