![我应该把函数放在 .bashrc、.bash_aliases 还是 .profile 中](https://linux22.com/image/1208548/%E6%88%91%E5%BA%94%E8%AF%A5%E6%8A%8A%E5%87%BD%E6%95%B0%E6%94%BE%E5%9C%A8%20.bashrc%E3%80%81.bash_aliases%20%E8%BF%98%E6%98%AF%20.profile%20%E4%B8%AD.png)
我读过了此主题关于在哪里放置别名。
现在,假设我的自定义命令非常复杂(在输入中接受参数,由几个接连运行的命令组成,为了清楚起见我想将其保存为多行,涉及引号、双引号等),所以我想将其定义为一个函数,例如
sshdev_system_loop () {
while true; do
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Trying to log into ststem $2 as user $1 ."
timeout 10 ssh $1@$2
done
}
我应该把它放在 里面.bash_aliases
或 末尾.bashrc
还是 里面.profile
?
一方面,我不想把它放进去,.bash_aliases
因为它会“破坏”
alias alias_name='command/list of commands'
另一方面,.bashrc
它看起来像一个由操作系统管理的文件,所以我不想在其中添加东西。
那么在 Ubuntu 中将函数添加为自定义命令的最佳做法是什么?
答案1
这在很大程度上取决于您以及您如何使用计算机。bash_aliases
不是标准文件,这是 Ubuntu 添加到系统中的内容。如果您查看 Ubuntu 的默认设置.bashrc
( /etc/skel/.bashrc
),您将看到:
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
如果文件存在,Ubuntu 会自行读取该文件(即.
把文件读入当前 shell)。所以如果你打算将你的设置迁移到其他地方,就不要使用它bash_aliases
。
如果您只关心 Ubuntu,那么使用bash_aliases
或bashrc
是一样的。它们将同时被读取,因为其中一个是另一个的来源,因此选择使用哪一个取决于您。
也就是说,该.bashrc
文件绝对是供用户编辑而不是由操作系统管理的,所以您可以随意编辑它。传统上,您会将别名和函数放在中~/.profile
,但是,因为.bashrc
每次启动新的交互式非登录 shell 时都会读取它,而.profile
仅由交互式登录 shell 读取。实际上,在现代图形系统上,这意味着.bashrc
(.bash_aliases
在 Ubuntu 上)每次打开新终端时都会读取它,而.profile
仅当您登录时才会读取它。所以人们会尝试保持.bashrc
精简,这样每次读取就不会花太长时间。然而,在现代系统上,它确实没有任何明显的区别。我们的机器足够快,可以毫无问题地读取更大的文件。
另一个考虑因素是,.profile
和.bashrc
分别由不同类型的 shell、登录和非登录读取,如上所述。请参阅我的答案这里和这里有关这方面的更多详细信息。关键在于,在传统系统上,当运行非登录 shell 时,.profile
不会读取。但是,Ubuntu 就像其父 Debian 一样,在其.profile
源代码中有一行特殊的内容.bashrc
:
$ grep -A1 bashrc /etc/skel/.profile
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
所有这些意味着您可以根据需要向.bashrc
或.bash_aliases
文件添加函数,并且它们仍可用于登录 shell。您可能希望使用.profile
,但请随意使用.bashrc
。这就是它的用途:让用户为他们的 shell 定义额外的东西。
一些有用的参考资料:
答案2
对 Terdon 的精彩回答稍作修改:
我选择的解决方案是向我的区块中添加一个新区块,.bashrc
其内容如下:
if [[ -f ~/.bash_functions ]]
then
. ~/.bash_functions
fi
如您所见,其原理与完全相同.bash_aliases
,只是我更喜欢在单独的文件中定义我的函数.bash_functions
。
然后,还有另一个转折。当我定义函数时,我会这样做:
# Go up in directory structure
_up() {
local d=""
local limit="$1"
# Default to limit of 1
if [ -z "$limit" ] || [ "$limit" -le 0 ]; then
limit=1
fi
for ((i=1;i<=limit;i++)); do
d="../$d"
done
cd "$d"
}
然后,我实际上在我的.bash_aliases
文件中引用了该函数:
alias up='_up'
这样,当我运行 时,我的函数就会显示在别名列表中alias
,但由于它以 开头_
,所以我知道它是在 中定义的函数.bash_functions
。