Як я можу створити локальну функцію в моєму bashrc?


40

Мій .bashrc мав деякий код, який повторювався, тому я використав функцію для його спрощення

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

Однак тепер, коли я використовую свою оболонку, ім'я "do_stuff" знаходиться в області застосування, щоб я міг виконати вкладку та запустити цю функцію (потенційно зіпсував мої змінні середовища). Чи є спосіб зробити "do_stuff" видимим лише всередині .bashrc?


2
Якщо ви не потребували експорту, ви також ()можете скористатися додатковою оболонкою. Інша можливість для простих випадків - це використання for version in 5.1 5.2циклу, хоча це дозволяє versionвийти.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


40

Використовувати unsetяк останній рядок у своєму .bashrc:

unset -f do_stuff

видалить / вимкне функцію do_stuff.

Щоб видалити / вимкнути змінні, викликайте її наступним чином:

unset variablename

Невже невже тут єдиний шлях? Ну, я думаю, якщо я буду використовувати для своєї функції дійсно довге і потворне ім'я, шанс її зіткнутися з чимось іншим не буде таким великим ...
hugomg

Якщо це проблема перевірки Фріст , якщо функція існує: if type do_stuff >/dev/null 2>&1; then echo "exists"; else echo "dont"; fi.
хаос

8
Це не працюватиме, якщо do_stuffвін використовується всередині іншої функції. Коли ви зателефонуєте на цю функцію, ви отримаєте bash: do_stuff: command not found. Я знаю, що це не точний випадок, про який говорила оп, але це варто зазначити.
Бурхан Алі


15

Інший варіант - використовувати підкреслення, як на інших мовах сценаріїв, щоб вказати, що ви не збираєтесь публічно використовувати цю функцію. Ймовірність набору тексту _do_foo досить мала, а також навряд чи конфліктує з ким-небудь ще.


1
Так, використовуйте "_", щоб вказати намір мати приватну функцію, але це не має нічого спільного з конфліктами. Будь-хто може знадобитися "_debug ()" або "_safe_copy ()". Якщо є щось, що допомагає уникнути конфліктів, це не має нічого спільного з підкресленнями.
Алоїз Магдал

3

Єдине рішення, про яке я можу придумати, - це підкреслити його та дати йому досить унікальне ім’я, можливо, навіть розставивши його з крапками, як мова модного одягу ( але це не спрацює у старомуsh ).

Чорт, це не матиме жодних конфліктів:

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< `echo $(xargs printf <<< "$1")`; }
}

0

Як запропоновано в коментарі, ви можете використовувати підзаголовок:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

Ми будуємо інший скрипт на стандартному виході для підрозділу для єдиного бажаного побічного ефекту (використовуючи hereдокумент <<SIDE). Тоді ми з джерелом ..

Сила "mise en abime" sh- це страхітливе джерело дива.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.