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


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.