Domanda

Mi capita spesso di voler cambiare la directory in cui un determinato eseguibile si trova.Quindi vorrei qualcosa di simile

cd `which python` 

per passare alla directory in cui il comando python è installato.Tuttavia, questo non è ovviamente illegale, dal momento che il cd prende una directory, non un file.C'è, ovviamente, alcune regexp-pippo ho potuto fare a togliere il nome del file, ma che avrebbe sconfitto il punto di essere un semplice one-liner.

È stato utile?

Soluzione

Qui:

cd $(dirname `which python`)

Modifica:

Ancora più facile (in realtà testato questa volta):

function cdfoo() { cd $(dirname `which $@`); }

Poi "cdfoo python".

Altri suggerimenti

Per evitare tutti quei programmi esterni ( 'dirname' e di gran lunga peggiore, l'inutile ma popolare 'che') forse un po 'riscritto:

cdfoo() {
  tgtbin=$(type -P "$1")
  [[ $? != 0 ]] && {
    echo "Error: '$1' not found in PATH" >&2
    return 1
  }
  cd "${tgtbin%/*}"
}

Questo risolve anche la parola 'funzione' raro dall'alto e aggiunge (molto semplice) la gestione degli errori.

Può essere un inizio per una soluzione più sphisticated.

Per il confronto:

zsh:~% cd =vi(:h)
zsh:/usr/bin%

=cmd restituisce il percorso e cmd (h) è un glob modificatore a prendere la testa

zsh è di sola scrittura, ma potente.

una cosa del genere dovrebbe fare il trucco:

cd `dirname $(which python)`

Una caratteristica che ho usato è assegnare pushd / popd. Questi mantenere uno stack di directory in modo che non c'è bisogno di cercare di mantenere la storia di dove eravate, se si desidera tornare alla directory di lavoro corrente prima di modificare le directory.

Ad esempio:

pushd $(dirname `which $@`)
...
popd

Si potrebbe usare qualcosa di simile a questo:

cd `which <file> | xargs dirname`

Ho aggiunto un po 'di semplice gestione degli errori che rende il comportamento di cdfoo () segue quella di nomedir per gli argomenti inesistente / nonpath

function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top