4

首先,我想纠正一下我的词汇量。我假设终端为 bash 提供了一个环境,它是 shell 的一种类型/版本。这个对吗?

我正在尝试在我的开发过程中更多地利用 bash 和 shell 来加速部署。但是,我才刚刚开始了解我从小学到的命令之外的基础知识。

我已经开始在终端中制作函数来帮助自动化我的一些更重复的任务。在我退出终端之前,这一切都是发现和花花公子。

我假设 shell 在一个实例中运行,所以当我退出终端时该实例会丢失。我注意到 shell 留下了一个 .bash_history,也可以使用“历史”访问,在那里我可以从旧会话中看到我的旧函数。但是,当然,它们似乎不再执行。

我认识到我可以创建一个 shell 脚本,但这会引入编译问题,并且必须更加注意脚本的相对存储位置。

问题:当我使用 command(){} 创建 bash 脚本时,它们在关闭终端后不会持续存在。我可以让他们在新的终端会话上这样做吗?我可以访问我的旧功能而无需求助于 shell 脚本?


编辑:我还想提一下,我尝试使用传统方法广泛地找到这个问题,但是搜索词中的“保存”和“退出”通常会指向 shell 的其他方面。

4

4 回答 4

2

你的第一个陈述是正确的。终端实例运行一种 shell(bash、sh、csh)

您可以将它们添加到您的 ~/.bashrc 文件中,或者将保存的脚本路径(无需编译)添加到您的 PATH 变量中。

您也可以将脚本复制到 /usr/local/bin 以便随时快速访问。您无需跟踪它们的相对位置。这非常方便,并使您的脚本可供其他用户使用(如果权限设置正确,则不能使用)

于 2012-06-21T23:37:50.310 回答
2

请参阅Bash 参考手册的交互式使用历史记录部分,了解如何从历史记录中执行命令。

例如,键入!?foo并按下Enter将执行包含“foo”的最新命令。我喜欢shopt -s histverify histreedit在我的~/.bashrc,所以我可以编辑和确认命令,如果需要,而不是立即执行它。

另请参阅用于操作历史记录的命令部分,了解可用于搜索要调用和执行的历史记录条目的击键。

例如,按Ctrl-r并键入foo将调用包含“foo”的最新命令。您可以按Ctrl-r多次以继续反向搜索其他匹配命令。Enter当您准备好执行当前显示的操作时按- 或Ctrl-g中止搜索。

如果您添加stty -ixon到您的~/.bashrc,那么您可以使用Ctrl-s在您开始向后搜索后向前搜索历史。

当然,您可以通过编辑~/.bashrc和添加函数来保存函数。我更喜欢将我的函数保存在我创建的名为的文件中~/bin/functions,然后在该文件中添加一行~/.bashrc。线看起来像. ~/bin/functions

我将较大的脚本保存在/usr/local/bin或中~/bin。前者应该已经在您的路径中,您可以通过编辑将后者添加到您的路径中~/.bashrc

于 2012-06-22T01:16:30.317 回答
1

在命令行上输入函数后,您可以使用命令行编辑来调用它们(如@Dennis Williamson 所述),但有一种更简单的方法:declare -f. 此命令列出所有当前函数,您可以将它们重定向到文件:

home/user1> function myfunc {
> echo "Hollow world!"
> }

/home/user1> declare -f > myfuncs
/home/user1> more myfuncs
myfunc () 
{ 
    echo "Hollow world"
}

请注意 Bash 如何将函数语法从 Korn shell 更改为 Bourne shell!幸运的是,两者在 Bash 中没有区别(与 ksh93 不同)。

当您需要加载函数时,这很简单:

/home/user1> source myfuncs
/home/user1> myfunc
Hollow world!

顺便说一句,您不需要执行权限,只需读取。您可以(正如其他人所说)将其添加到您的一个启动文件中,例如.bashrc.

于 2012-06-22T08:11:15.717 回答
1

您可以创建一个包含所有功能的简单库。这基本上可以解决您存储功能的问题。

 yeshwantnaik$ cat my_functions.lib
function do_something(){
 #your code goes here
}

将其保存在您想要的任何位置。最好放在您的 $HOME 目录中。

加载库。不要错过开头的那个点。

 yeshwantnaik$ . $HOME/my_functions.lib

现在你可以直接运行你的函数了。

 yeshwantnaik$ do_something

让 Linux 为你做事

您可以跳过手动加载库的步骤,让 Linux 在您自动登录时为您执行此操作。

运行以下命令

echo ". $HOME/my_functions.lib" >> ~/.bashrc
echo ". $HOME/my_functions.lib" >> ~/.bash_profile
source ~/.bashrc
source ~/.bash_profile

而已。您可以直接从命令行执行您的函数,而无需执行任何操作。

于 2018-07-28T14:21:45.603 回答