Я хочу создать функцию в моем bashrc, cwhich, которая сохранит результат, из которого $ 1 в пути var, а затем cd к нему. Но это запустит часть программного обеспечения, например cwhich python, cwhich blender и т. Д. Я хочу отрезать текст после последнего появления /, а затем cd в действительном каталоге. Его единственное небольшое неудобство, но, найдя или ищет решения для них, я надеюсь стать более прагматичным, эффективным и знающим. Помощь приветствуется.sed или какой-либо другой инструмент командной строки для удаления последнего события/
ответ
Внешний инструмент, который вы хотите использовать для этого: dirname
.
Так что ваша функция будет выглядеть следующим образом:
cwhich() {
local bin=$(which "$1")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
Это, говорит, что это две внешние инструменты для этого что более два, чем вы на самом деле нужно здесь.
Вы должны использовать либо type -p
, либо command -v
вместо which
. Они оба стандартизированы (which
- нет) и являются встроенными встроенными оболочками (which
), поэтому они более портативны, гарантированно будут там и будут быстрее, так как они не порождают внешний процесс. (Мы не можем избежать подоболочку для тех, кто все же.)
Это делает функцию:
cwhich() {
local bin=$(command -v -- "$1")
local bindir=$(dirname -- "$bin")
cd -- "$bindir"
}
Это все еще оставляет dirname
, хотя и мы не должны использовать, что для этого мы можем использовать Shell Parameter Expansion вместо этого и сохранить внешний процесс (и суб-оболочки на этот раз):
cwhich() {
local bin=$(command -v -- "$1")
local bindir=${bin%/*}
cd -- "$bindir"
}
следует отметить, что dirname
и ${var%/*}
не являются строго идентичными. Есть некоторые угловые случаи, когда они различаются, но для этого использования я не считаю, что любой из этих угловых дел имеет значение. (См. this fantastic answer для более подробного обсуждения этой разницы.)
Вы можете заметить, что в этой функции нет проверки ошибок. Вероятно, мы должны добавить это сейчас.
cwhich() {
local bin=$(command -v -- "$1")
local bindir=${bin%/*}
{ [ -z "$bin" ] || [ -z "$bindir" ]; } && return
cd -- "$bindir"
}
Отличный ответ! Никогда не знал, что «что» это зло! :) – hek2mgl
@ hek2mgl 'evil' - сильное слово, но это не тот инструмент, который многие люди считают. –