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


14

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

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

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

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

Ответы:


14

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

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

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

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

Я использовал более поздний вариант. Моя функция содержит команды, которые удаляют файлы, что-то wget, выполняет команды javac и java. и когда я попробовал это на терминале gnome, он не работает нормально. Как вы думаете, есть проблема?
Абель Мелькиадес Каллехо

Что он делает вместо этого?
Оли

Это уже исправлено. Исправлено с помощью этого ответа
Абель Melquiades Callejo

хм ... разве пользовательские скрипты не должны /usr/local/binвместо этого возиться с $PATH?
Брайам

Мне кажется, что небольшое, но заслуживающее упоминания преимущество размещения функций ~/.bashrc(как и sourced) заключается в том, что Bash ищет функции перед выполнением поиска по PATH.
Занна

4

Наилучшим выбором будет ~/.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чтобы проверить его существование и затем получить его.


спасибо, это сработало. кстати, чем он отличается от .profile? в некоторых Linux я не могу поместить функции в bashrc
Abel Melquiades Callejo

2
~/.profileФайл выполняется интерпретатором команд для оболочек входа в систему. Когда вы используете GUI и открываете терминал, этот файл не выполняется, потому что вы будете в оболочке, не входящей в систему.
Раду Рэдяну

1

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

  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: «Функции выполняются в контексте текущей оболочки; не создается новый процесс для их интерпретации». Это означает, что вы также должны знать о функциях, которые могут изменять среду выполнения вашей оболочки - изменять переменные и настройки терминала.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.