Де можна помістити визначену користувачем функцію оболонки?


14

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

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

так що коли я використовую команду lazymodeв оболонці , вона видасть Hello World!.

У який файл слід поставити визначену користувачем функцію?

Відповіді:


14

Залежить від функції. Якщо це просто суперпростий однолінійний зразок, подібний до цього, ви можете створити псевдонім або вставити функцію ~/.bashrc(файл, який завантажується bash при запуску).

Якщо ви створюєте щось трохи м'ясніше, може бути більше сенсу створити власний виконуваний скрипт, у ~/bin/якому за замовчуванням його не буде (це лише каталог), але він повинен бути на вашому шляху. Пам'ятайте, що для цього файл повинен бути виконуваним ( chmod +x filename) і починати з належної #!/bin/bashстрофи.

Другий маршрут має деякі чіткі переваги:

  • Простіше зрозуміти, що є в наявності
  • Помилка синтаксису не підкреслить ваш профіль
  • Якщо ви змінюєте сценарій, вам не потрібно продовжувати повторне використання баш-конфігурації
  • Він доступний для будь-якої оболонки до тих пір, поки використовується повний шлях або також ~/bin/є шлях до цієї оболонки (що це повинно бути в більшості випадків AFAIK).

Я використав пізніший варіант. Моя функція містить команди, які видаляють файли, щось wget, виконує команди javac та java. і коли я спробував це на gnome-терміналі, це не працює добре. Як ви думаєте, проблема є?
Abel Melquiades Callejo

Що він робить замість цього?
Олі

Це вже виправлено. Виправлено через цю відповідь
Abel Melquiades Callejo

umm ... чи не повинні користувацькі сценарії /usr/local/binзамість того, щоб возитися з $PATH?
Брайам

Мені здається, що невелика, але варта згадати перевага введення функцій ~/.bashrc(як це і є source) полягає в тому, що 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Файл виконується інтерпретатором команд для оболонок входу. Якщо ви користуєтесь графічним інтерфейсом та відкриваєте термінал, цей файл не виконується, оскільки ви знаходитесь в оболонці, яка не входить.
Radu Rădeanu

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.