Як додати функцію до .bash_profile / .profile / bashrc в оболонці?


24

У мене є функція, яка перетворює епоху на сьогоднішній день. Ось визначення

date1(){
  date -d @$1
}

Я хотів би вміти писати:

$ date1 xxxyyy

Де xxxyyy - параметр, я передаю свою функцію, щоб отримати відповідну дату. Я розумію , що я повинен додати його в будь-якому .bash_profile, .profileабо .bashrcі його джерелом:

$ source file

Але я не впевнений, у який файл його розмістити. Зараз я маю його .profile. Але щоб його запустити, я мушу робити source .profileщоразу.

В ідеалі він повинен зробити його доступним, коли комп'ютер запускається як змінна середовище.


для вхідного зразка; 1. текстовий вихід epochconverter.com зараз становить 1514917788; Сама $ дата +% 2.В Баш на одній stackoverflow.com/questions/1092631 / ...
AnneTheAgile

Відповіді:


25

Від man bash:

Коли bash викликається як інтерактивна оболонка входу, або як неінтерактивна оболонка з опцією --login, вона спочатку зчитує та виконує команди з файлу / etc / profile, якщо такий файл існує. Прочитавши цей файл, він шукає у такому порядку ~ / .bash_profile, ~ / .bash_login та ~ / .profile та зчитує та виконує команди з першого, який існує та читається.

Іншими словами, ви можете помістити його в будь-якому з ~/.bash_profile, ~/.bash_loginабо ~/.profile, або будь-які файли sourced або з них . Зазвичай ~/.profileбуде джерелом ~/.bashrc, який є "персональним файлом ініціалізації, виконаним для оболонок входу".

Щоб увімкнути це, запустіть нову оболонку, запустіть exec $SHELLабо запустіть source ~/.bashrc.


1
Добре, я спробував ваш спосіб створення власної функції друку аргументу, але навіть якщо я додаю цю функцію, .bash_profileтоді я також повинен робити source ~/.bash_profileкожен раз, коли я відкриваю термінал за ярликом Ctrl+Alt+T.
Вікі Дев

@VickyDev Якщо вам доведеться source ~/.bash_profileкожного разу, то це свідчить про те, що ваша настройка Bash якось нестандартна або зламана (відповідно до man bashзгаданих результатів). Ви впевнені, що насправді керуєте Bash? Наприклад, чи echo $BASHPIDдрукує щось?
l0b0

Вам потрібно додати #!/bin/shвгорі сторінки, .profileщоб визначити функцію?
Калонь Колоб

13

Після того, як ви визначите функцію у вашому .profile, додайте export -f date1. Це експортує функцію для використання вашою оболонкою для входу.


+1 для експорту, мені довелося викликати псевдонім у ssh ProxyCommand, і він продовжував читати псевдоніми, не знайдені навіть після джерела .profile. Діє як шарм після експорту.
Абхішек Ананд

7

Налаштування інтерактивних оболонок входить ~/.bashrc. Речі, які ви хочете запустити під час входу, переходять ~/.profile(або ~/.bash_profile, але вони часто не завантажуються при графічному вході).

Поставте це визначення функції ~/.bashrc.

Оскільки bash не завантажується, .bashrcколи це оболонка для входу, змушуйте це робити так: напишіть ~/.bash_profileмістить

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

тобто завантажують ~/.profile, а також завантажують, ~/.bashrcякщо оболонка інтерактивна.

Див. Альтернативу .bashrc та пов’язані там публікації.


1

csh і tcsh не підтримують такі функції, як bash, але ви можете це зробити.

Наприклад, ось проста функція друку тексту

alias print_hello_world 'eval echo "hello world"'

передаючи аргументи сценарію

repeate_after_me 'eval echo "$1"'

робити багаторядковий код на зразок if, якщо вираз начебто складний, але ось ви йдете.

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

вам все одно доведеться оцінювати, але найскладніша частина - це робити \!:[x]синтаксис, щоб отримати вхід з командного рядка.

Цього має бути достатньо, щоб розібратися.


0

Ви можете перенаправити всі поточні функції до bashrc з набором .

Наприклад, ось як я додаю в bashrc функцію команди Opentack з необов'язковим параметром:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

Тепер він зберігається для майбутніх сеансів і може використовуватися таким чином:

$ urc 

або

$ urc --debug

-1

пункт 18: У моїй старшій пам’яті, коли адмін, навчання ksh та bash було кином іншим способом. 1: - / etc / вміст профілю - sysWide. / etc / skel містив файл, наданий для нових облікових записів. Оскільки Баш зараз простий у всіх дистрибутивах. наступним було б 2: - ~ / .profile як системний стандарт, тоді в вмісті .profile "якщо існує" .bash_profile поставив би -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases буде в на мій погляд, правильніший порядок, встановлення стандартного середовища для терміналів і оболонок і звичайного .bash_login, ніколи не знайденого або існуючого (його звичай на користувача). З .profile $ PATH є основним, якщо.
Я зараз знаходжу додавання .bash_profile .profile все ще домінує і не поважає наявність .bash_profile. Поряд із інформацією заголовка ніхто не оновлюється, тобто: bash startup Samples - структури каталогів більше немає - поряд із прикладами та або gzip'd файлами. Тож оновлення до Gnu-Bash вже в порядку


1
Про що ти йдеш?
Jesse_b
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.