Однострочный bash для перехода в каталог, в котором находится какой-либо файл - PullRequest
8 голосов
/ 13 мая 2009

Я часто хочу перейти в каталог, где находится конкретный исполняемый файл. Так что я хотел бы что-то вроде

cd `which python` 

чтобы перейти в каталог, где установлена ​​команда python. Однако это, очевидно, незаконно, поскольку cd принимает каталог, а не файл. Очевидно, что есть несколько регулярных выражений, которые я мог бы сделать, чтобы удалить имя файла, но это лишило бы смысла простую однострочную реплику.

Ответы [ 7 ]

16 голосов
/ 13 мая 2009

Здесь:

cd $(dirname `which python`)

Edit:

Еще проще (на этот раз проверено):

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

Тогда "cdfoo python".

8 голосов
/ 13 мая 2009

Чтобы избежать всех этих внешних программ («dirname» и, что еще хуже, бесполезных, но популярных «which»), возможно, немного переписано:

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

Это также исправляет необычное ключевое слово 'function' сверху и добавляет (очень простую) обработку ошибок.

Может стать началом более сложного решения.

3 голосов
/ 13 мая 2009

Для сравнения:

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

= cmd расширяется до пути к cmd и (: h) является модификатором glob, чтобы взять голову

Zsh только для записи, но мощный.

2 голосов
/ 13 мая 2009

Одной из функций, которую я использовал, является pushd / popd. Они поддерживают стек каталогов, так что вам не нужно пытаться сохранять историю того, где вы были, если вы хотите вернуться к текущему рабочему каталогу до изменения каталогов.

Например:

pushd $(dirname `which $@`)
...
popd
2 голосов
/ 13 мая 2009

что-то подобное должно сделать свое дело:

cd `dirname $(which python)`
1 голос
/ 13 мая 2009

Вы можете использовать что-то вроде этого:

cd `which <file> | xargs dirname`
0 голосов
/ 13 мая 2009

Я добавил немного простой обработки ошибок, которая заставляет поведение cdfoo () следовать поведению dirname для несуществующих / непатиновых аргументов

function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}
...