Где я могу разместить пользовательскую функцию оболочки?

Я планирую создать функцию, которая упростит мне вещи. Функция будет что-то вроде

function lazymode()
{
echo "Hello World!";
}

так что когда я использую команду lazymode в оболочке он выведет Hello World!,

В какой файл я должен поставить пользовательскую функцию?

3 ответа

Решение

Зависит от функции. Если это просто супер-простая однострочная строка, вы можете создать псевдоним или вставить функцию в ~/.bashrc (файл, который bash загружает при запуске).

Если вы создаете что-то более мясистое, возможно, имеет смысл создать собственный исполняемый скрипт в ~/bin/ который не существует по умолчанию (это просто каталог), но должен быть в вашем пути. Помните, что для этого файл должен быть исполняемым (chmod +x filename) и начать с правильного #!/bin/bash строфа.

Второй маршрут имеет ряд явных преимуществ:

  • Легче увидеть что доступно
  • Синтаксическая ошибка не повлияет на ваш профиль
  • Вам не нужно продолжать использовать ваш bash-конфигурацию, если вы измените скрипт
  • Он доступен для любой оболочки, если используется полный путь или ~/bin/ находится в пути для этой оболочки (что должно быть в большинстве случаев AFAIK).

Лучший выбор будет ~/.bashrc файл.

Вы можете написать свои определения функций оболочки прямо в вашем ~/.bashrc файл, или, если у вас их много и вы не хотите загромождать ~/.bashrc файл, вы можете поместить их все в другой файл по вашему выбору - просто убедитесь, что источник этого файла в вашем ~/.bashrc файл. Например, если файл с вашими функциями называется bash_functionsПросто добавьте в свой ~/.bashrc подать строки:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

или, что эквивалентно:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

где . это просто символическое представление source, if тест проверяет файл /path/to/bash_functions существует, прежде чем пытаться найти его.

Этот метод очень похож на создание псевдонимов в ~/.bashrc создав файл с именем ~/.bash_aliases и используя синтаксис, аналогичный приведенному выше в ~/.bashrc проверить его существование, а затем найти его.

Вот важная процедура объявления постоянной функции:

  1. открыто ~/.bashrc файл в текстовом редакторе. Не имеет значения, какой текстовый редактор, если вы знаете, как его использовать, и когда вы открываете /home/<username>/.bashrc

  2. В конце ~/.bashrc объявите свою собственную функцию, например:

    find_dirs(){
        find "$1" -type d
    }
    
  3. Сохраните и закройте файл.

~/.bashrc файл читается каждый раз, когда вы открываете интерактивную оболочку (это новая вкладка терминала, войдите через sshили откройте TTY1 или другую виртуальную консоль). Это не будет доступно в файлах скриптов, потому что ~/.bashrc не читается для неинтерактивных оболочек. Это также не доступно, если вы запускаете bash с --norc вариант.

Если вы хотите, чтобы эта функция была доступна сразу на открытой вкладке, используйте source ~/.bashrc команда.


Функции принимают аргументы, как обычные команды. Например, $1 через $9 указать позиционные параметры при вызове функции. В приведенном выше примере find_dirs принимает только один позиционный параметр и будет называться find_dirs /etc, Вы также можете использовать $@ ссылаться на все позиционные параметры. Функции также принимают перенаправление. Вы можете вызвать функцию с find_dirs $1 > /dev/null; мы также можем объявить это следующим образом:

find_dirs(){
    find "$1" -type d
}

Примечание от man bash: "Функции выполняются в контексте текущей оболочки; новый процесс для их интерпретации не создается". Это означает, что вы также должны знать о функциях, которые могут изменять среду выполнения вашей оболочки - изменять переменные и настройки терминала.

Другие вопросы по тегам