Как вы вызываете функцию, определенную в .bashrc, из оболочки? - PullRequest
51 голосов
/ 01 октября 2009

В моем .bashrc у меня есть функция с именем hello:

function hello() {
   echo "Hello, $1!"
}

Я хочу иметь возможность вызывать hello () из оболочки следующим образом:

$ hello Lloyd

И получим вывод:

> Hello, Lloyd!

Что за хитрость?

(Реальная функция, которую я имею в виду, конечно, сложнее.)

РЕДАКТИРОВАТЬ: это действительно вызвано синтаксической ошибкой в ​​функции, я думаю! (

function coolness() {

    if[ [-z "$1"] -o [-z "$2"] ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}

Ответы [ 6 ]

68 голосов
/ 01 октября 2009

Вы можете экспортировать функции. В файле ~/.bashrc после определения функции добавьте export -f functionname.

function hello() {
   echo "Hello, $1!"
}

export -f hello

Тогда функция будет доступна в приглашении оболочки, а также в других сценариях, которые вы вызываете оттуда.

Обратите внимание, что нет необходимости экспортировать функции, если они не будут использоваться в дочерних процессах ("также" в предыдущем предложении). Обычно даже тогда лучше source добавить функцию в файл, в котором она будет использоваться.

Редактировать

Скобки в условных выражениях Bash - это не скобки, а команды. Они должны иметь пространство вокруг них. Если вы хотите сгруппировать условия, используйте скобки. Вот ваша функция:

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
        echo "Hi!"
}

Лучший способ написать это условие:

    if [[ -z "$1" || -z "$2" ]]; then

, потому что двойные скобки предоставляют больше возможностей, чем одиночные.

26 голосов
/ 01 октября 2009

Тест в вашей функции не будет работать - у вас не должно быть скобок вокруг предложений -z, и между if и открытой скобкой должен быть пробел. Следует читать:

function coolness() {

    if [ -z "$1" -o -z "$2" ]; then
        echo "Usage: $0 [sub_package] [endpoint]";
        exit 1;
    fi
    echo "Hi!"
}
16 голосов
/ 01 октября 2009

Включите в свой скрипт строку

source .bashrc

попробуйте с исходной конструкцией, она должна работать!

10 голосов
/ 23 ноября 2014

Любые изменения, внесенные в .bashrc, вступят в силу только в новом терминальном сеансе. Если вы хотите применить изменения к текущему сеансу терминала, вы должны дать команду оболочке перечитать .bashrc. Кратчайший путь к этому - использовать команду ., которая является синонимом source:

[user@linuxPc]$ . ~/.bashrc
4 голосов
/ 01 октября 2009
$ source .bashrc
0 голосов
/ 03 апреля 2019

Это странно; мой fuctin не прекратит работу, пока я не передам его другому экземпляру bash, например:

моя функция bash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...