Однострочник bash для перехода в каталог, в котором находится некоторый файл

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

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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 ) ));}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top