Однострочник bash для перехода в каталог, в котором находится некоторый файл
Вопрос
Я часто хочу перейти к каталогу, в котором находится конкретный исполняемый файл.Поэтому я бы хотел что-то вроде
cd `which python`
чтобы перейти в каталог, в котором установлена команда python.Однако это явно незаконно, поскольку cd принимает каталог, а не файл.Очевидно, что есть какое-то регулярное выражение foo, которое я мог бы сделать, чтобы удалить имя файла, но это лишило бы смысла то, что это простая однострочная строка.
Решение
Здесь:
cd $(dirname `which python`)
Редактировать:
Еще проще (на этот раз действительно протестировано):
function cdfoo() { cd $(dirname `which $@`); }
Затем "cdfoo python".
Другие советы
Чтобы избежать всех этих внешних программ ('dirname' и, что гораздо хуже, бесполезного, но популярного 'which'), возможно, немного переписано:
cdfoo() {
tgtbin=$(type -P "$1")
[[ $? != 0 ]] && {
echo "Error: '$1' not found in PATH" >&2
return 1
}
cd "${tgtbin%/*}"
}
Это также исправляет необычное ключевое слово 'function' из приведенного выше и добавляет (очень простую) обработку ошибок.
Может быть началом для более узкого решения.
Для сравнения:
zsh:~% cd =vi(:h) zsh:/usr/bin%
=cmd расширяется до пути к cmd и (:h) является модификатором glob для размещения заголовка
zsh доступен только для записи, но мощный.
что-то подобное должно сработать :
cd `dirname $(which python)`
Одна из функций, которую я выделил, - это pushd / popd.Они поддерживают стек каталогов, так что вам не нужно пытаться вести историю того, где вы были, если вы хотите вернуться в текущий рабочий каталог до смены каталогов.
Например:
pushd $(dirname `which $@`)
...
popd
Вы могли бы использовать что-то вроде этого:
cd `which <file> | xargs dirname`
Я добавил немного простой обработки ошибок, которая заставляет поведение cdfoo() следовать поведению dirname для несуществующих аргументов / nonpath
function cdfoo() { cd $(dirname $(which $1 || ( echo . && echo "Error: '$1' not found" >&2 ) ));}