如何在外壳中向.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.从庆典本身的$ date +%每一台S stackoverflow.com/questions/1092631/...
AnneTheAgile

Answers:


25

来自man bash

当bash作为交互式登录shell或具有--login选项的非交互式shell被调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。

换句话说,你可以把它放在任何一个~/.bash_profile~/.bash_login或者~/.profile或任何文件source由这类原因ð。通常,~/.profile~/.bashrc将是“针对登录Shell执行的个人初始化文件”。

要启用它,请启动一个新的shell,然后运行exec $SHELL或运行source ~/.bashrc


1
好吧,我尝试了创建打印自变量的自定义函数的方法,但是即使我在该函数中添加了该函数,每次我用快捷方式打开终端时.bash_profile也必须这样做。source ~/.bash_profileCtrl+Alt+T
Vicky Dev

@VickyDev如果您source ~/.bash_profile每次都必须这样做,则表明您的Bash设置某种程度上是非标准的或已损坏(根据上述man bash输出)。您确定您实际上正在运行Bash吗?例如,echo $BASHPID打印什么吗?
l0b0

您需要添加#!/bin/sh到的顶部.profile以定义功能吗?
Kolob Canyon

13

在中定义函数后.profile,添加export -f date1。这将导出该函数供您的登录Shell使用。


+1进行导出,我不得不在ssh ProxyCommand中调用和别名,并且它一直在困扰着即使在源.profile之后也找不到的别名。导出后就像魅力一样。
Abhishek Anand

7

交互式shell的定制进入~/.bashrc。登录时要运行的内容~/.profile(或~/.bash_profile,但是以图形方式登录时通常不会加载)。

将此函数定义放在中~/.bashrc

由于bash .bashrc在作为登录shell时不会加载,因此请强制执行此操作:写一个~/.bash_profile包含

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

即load ~/.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

您可以使用typeset将所有当前函数重定向到bashrc 。

例如,这是我如何将带有可选参数的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 and Shell环境以及从未找到或不存在的常规.bash_login(针对每个用户的自定义)。如果。,.profile $ PATH是主要的。
我发现现在也添加了.bash_profile .profile仍然占主导地位,并且不尊重.bash_profile的存在。除了标头信息外,没有人进行更新,即:bash启动示例-目录结构不再-带有示例和/或文件的文件均已gzip压缩。所以按顺序更新到Gnu-Bash


1
你到底怎么了
Jesse_b
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.