我应该把函数放在 .bashrc、.bash_aliases 还是 .profile 中

我应该把函数放在 .bashrc、.bash_aliases 还是 .profile 中

我读过了此主题关于在哪里放置别名。

现在,假设我的自定义命令非常复杂(在输入中接受参数,由几个接连运行的命令组成,为了清楚起见我想将其保存为多行,涉及引号、双引号等),所以我想将其定义为一个函数,例如

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_aliasesbashrc是一样的。它们将同时被读取,因为其中一个是另一个的来源,因此选择使用哪一个取决于您。

也就是说,该.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

相关内容