Как добавить функцию в .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. от самого bash $ date +% s за stackoverflow.com/questions/1092631/…
AnneTheAgile

Ответы:

25

От man bash:

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

Другими словами, вы можете поместить его в любой из ~/.bash_profile, ~/.bash_loginили ~/.profile, или в любой файл source, любой из которых . Обычно ~/.profileисточником ~/.bashrcбудет «личный файл инициализации, выполняемый для оболочек входа».

Чтобы включить его, запустите новую оболочку, запустите exec $SHELLили запустите source ~/.bashrc.

l0b0
источник
1
Ну, я попробовал ваш способ создания пользовательской функции печати аргумента, но даже если я добавлю эту функцию, .bash_profileмне придется делать это source ~/.bash_profileкаждый раз, когда я открываю терминал с помощью ярлыка Ctrl+Alt+T.
Вики Дев
@VickyDev Если вам приходится source ~/.bash_profileкаждый раз, то это указывает на то, что ваша установка Bash каким-то образом нестандартна или сломана (согласно man bashупомянутому выводу). Вы уверены, что на самом деле используете Bash? Например, что- echo $BASHPIDнибудь печатает?
10
Вам нужно добавить #!/bin/shв начало, .profileчтобы определить функцию?
Каньон Колоб
13

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

DopeGhoti
источник
+1 для экспорта, я должен был вызывать и псевдоним в ssh ProxyCommand, и он продолжал писать о псевдониме, не найденном даже после исходного .profile. Работает как брелок после экспорта.
Абхишек Ананд
7

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

Поместите это определение функции в ~/.bashrc.

Поскольку баш не загружается , .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"'

вам все равно придется пробовать eval, но самая сложная часть - это \!:[x]синтаксис для получения ввода из командной строки.

Этого должно быть достаточно, чтобы разобраться с вами.

user1610950
источник
0

Вы можете перенаправить все текущие функции в bashrc с помощью typeset .

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

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

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

$ urc 

или

$ urc --debug
Ноам Манос
источник
-1

пункт 18: в моей старой памяти, когда администратор изучал ksh и bash, это был другой путь. 1: - / etc / profile - это sysWide. Файл / etc / skel содержит файл для новых учетных записей. Так как Bash сейчас главный общий дистрибутив. следующий будет 2: - ~ / .profile как системный стандарт, тогда в пределах содержимого .profile «если существует» .bash_profile поместит -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases будет в На мой взгляд, более правильный порядок, настройка стандартной среды Terminal и Shell и обычного .bash_login не найдены и не существуют (его пользовательский для каждого пользователя). При этом .profile $ PATH является основным, если.
Я обнаружил, что добавление .bash_profile .profile все еще доминирует и не уважает присутствие .bash_profile. Наряду с информацией заголовка никто не обновляет, например: bash startup Samples - этой структуры каталогов больше нет - вместе с примерами и / или файлами gzip'd. Так что обновление для Гну-Баш в порядке

AtomicK
источник
1
О чем ты?
Jesse_b