2015-05-01 5 views
1

Я хочу создать функцию в моем bashrc, cwhich, которая сохранит результат, из которого $ 1 в пути var, а затем cd к нему. Но это запустит часть программного обеспечения, например cwhich python, cwhich blender и т. Д. Я хочу отрезать текст после последнего появления /, а затем cd в действительном каталоге. Его единственное небольшое неудобство, но, найдя или ищет решения для них, я надеюсь стать более прагматичным, эффективным и знающим. Помощь приветствуется.sed или какой-либо другой инструмент командной строки для удаления последнего события/

ответ

1

Внешний инструмент, который вы хотите использовать для этого: 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" 
} 
+0

Отличный ответ! Никогда не знал, что «что» это зло! :) – hek2mgl

+1

@ hek2mgl 'evil' - сильное слово, но это не тот инструмент, который многие люди считают. –