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

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

我计划创建一个可以简化我的事情的函数。该函数类似于

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

这样当我使用命令lazymode,它将输出Hello World!

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

答案1

取决于函数。如果它只是像这样的超简单的单行代码,您可以创建别名或将函数粘贴到~/.bashrc(bash 启动时加载的文件)。

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

第二种方式有明显的好处:

  • 更容易看到可用的内容
  • 语法错误不会影响你的个人资料
  • 如果你更改了脚本,则无需继续重新获取 bash 配置
  • 只要使用完整路径或~/bin/也位于该 shell 的路径中(据我所知大多数情况下应该是这样的),它就可以用于任何 shell。

答案2

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

你可以直接在文件中编写 shell 函数定义~/.bashrc,或者,如果你有很多函数定义,并且不想让文件杂乱~/.bashrc,你可以将它们全部放在你选择的另一个文件中 - 只需确保 source在您的文件中创建文件~/.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测试它的存在,然后获取它。

答案3

以下是声明永久函数的基本步骤:

  1. 在文本编辑器中打开~/.bashrc文件。无论使用哪种文本编辑器,只要您知道如何使用它,并且打开/home/<username>/.bashrc

  2. 在声明自己的函数的最后~/.bashrc,例如:

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

~/.bashrc每次打开交互式 shell(即新终端选项卡、通过 登录,或打开 TTY1 或其他虚拟控制台)时,都会读取该文件ssh。这在脚本文件中不可用,因为非交互式 shell 不会读取。如果您使用选项~/.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:“函数在当前 shell 的上下文中执行;不会创建新进程来解释它们”。这意味着您还应该知道函数能够改变您的 shell 执行环境 - 更改变量和终端设置。

相关内容