我可以在哪里放置用户定义的shell函数?


14

我计划创建一个可以简化我工作的函数。该功能将类似于

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

这样当我lazymodeshell中使用命令时,它会输出Hello World!

我应该将用户定义的函数放在哪个文件中?

Answers:


14

取决于功能。如果这只是一个非常简单的单行代码,则可以创建别名或将函数粘贴在其中~/.bashrc(bash在启动时加载的文件)。

如果您要创建更多内容,那么创建自己的可执行脚本可能会更有意义,该脚本在~/bin/默认情况下将不存在(它只是一个目录),但应位于您的路径中。请记住,为此文件将需要是可执行文件(chmod +x filename),并以适当的#!/bin/bash节开头。

第二种途径有一些明显的好处:

  • 更容易看到可用的东西
  • 语法错误不会破坏您的个人资料
  • 如果您更改脚本,则无需继续重新配置bash配置
  • 只要使用了完整路径,它就可以在任何外壳程序上使用,也~/bin/可以在该外壳程序的路径中使用(在大多数情况下,应为AFAIK)。

我使用了后面的选项。我的函数包含一些命令,这些命令删除文件(wget之类的文件),执行命令javac和java。当我在gnome终端上尝试时,它无法正常工作。您认为有问题吗?
Abel Melquiades Callejo

它是做什么的呢?
奥利(Oli)

它已经修复。通过此问题解决
Abel Melquiades Callejo 2013年

嗯...用户脚本不应该放在/usr/local/bin混乱中$PATH吗?
Braiam

在我看来,将函数放入~/.bashrc(尽管它是sourced)的一个小但值得一提的优点是Bash在执行PATH查找之前先查找函数。
Zanna

4

最好的选择是~/.bashrc文件。

你要么可以直接写你的shell函数定义在你的~/.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该文件由命令解释器针对登录Shell执行。当您使用GUI并打开终端时,不会执行该文件,因为您将处于未登录外壳中。
RaduRădeanu13年

1

这是声明永久功能的基本程序:

  1. ~/.bashrc在文本编辑器中打开文件。不管哪个文本编辑器都没有关系,只要您知道如何使用它,只要打开/home/<username>/.bashrc

  2. ~/.bashrc声明自己的函数的末尾,例如:

    find_dirs(){
        find "$1" -type d
    }
  3. 保存并关闭文件。

~/.bashrc每次您打开交互式外壳程序(即新的终端选项卡,通过进行登录ssh或打开TTY1或其他虚拟控制台)时,都会读取该文件。这在脚本文件中将不可用,因为~/.bashrc非交互式外壳程序不会读取该文件。如果bash使用--norcoption 运行,它也不可用。

如果希望该功能在当前打开的选项卡中立即可用,请使用source ~/.bashrc命令。


函数像常规命令一样接受参数。例如,$1通过$9在调用函数时指示位置参数。在上面的示例中,find_dirs仅采用一个位置参数,并将其称为find_dirs /etc。您也可以使用$@来引用所有位置参数。函数也接受重定向。您可以使用调用函数find_dirs $1 > /dev/null;我们也可以声明如下:

find_dirs(){
    find "$1" -type d
}

注意man bash:“函数是在当前shell的上下文中执行的;不会创建新的过程来解释它们”。这意味着您还应该意识到能够更改Shell执行环境的功能-更改变量和终端设置。

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.