我应该在 .bashrc 或 .profile 中放置别名吗?

我应该在 .bashrc 或 .profile 中放置别名吗?

我希望每次打开 shell 时都可以使用以下别名:

export ZONE="us-eastern1-c"
export INSTANCE_NAME="myInstance"
alias gc='gcloud compute ssh --zone=$ZONE jupyter@$INSTANCE_NAME -- -L 8080:localhost:8080'

我应该把它放进去.bashrc.profile?另外,浏览后.bashrc我发现:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

那么,这里的最佳做法是什么?我应该把别名(所需的环境变量)第三文件,.bash_aliases?我不太喜欢配置文件激增,但如果使用这.bash_aliases是一种最佳做法,我会这么做。

答案1

总结:根据您的描述,都可以放进去~/.bashrc,即使你会通常不想将环境变量放在那里。您可能还想进行其他一些更改:导出变量可能没有必要,最好引用它们的扩展。

Bash 别名概述,你可以把你的gc别名~/.bashrc~/.bash_aliases但它应该不是进去.profile如果变量仅在可以使用别名(扩展为使用它们的命令)的 shell 中需要,那么将它们放在与别名相同的位置实际上就可以了。

在这种情况下,我建议将别名和变量放在中~/.bashrc,因为虽然可以放入任何在 中~/.bash_aliases放置命令时,除了别名定义之外,通常不会将其他内容放在那里,这样做可能会让将来阅读代码的读者(可能包括您自己)感到困惑,并促使他们怀疑自己是否看到了错误。当然,您可以将别名放在 中~/.bash_aliases,将相关变量放在 中~/.bashrc,但我认为这会更加令人困惑。

通常情况下,不应将环境变量放在 中~/.bashrc。大多数情况下,用户特定的环境变量应该去在 中~/.pam_environment,它使用自己的特殊语法,或~/.profile,其中包含 shell 命令~/.bashrc。 (另请参阅这些评论) 其中一个原因是这些方法导致环境变量在大多数可能需要的情况下都可用,而将其放入则~/.bashrc无法实现;~/.bashrc仅由 所用bash,而当您以图形方式登录时,则不是bash。但是,当您只需要变量时,使用它们的别名也可用,则不适用。

尽管如此,我怀疑这实际上是不是例外。但不需要去其他地方.bashrc看起来这些变量不需要是环境变量。也就是说,您似乎不必导出它们,而只需简单地编写:

ZONE="us-eastern1-c"
INSTANCE_NAME="myInstance"

这是关于shell 变量环境变量. 在 Bash 等 Bourne 风格的 shell 中,所有环境变量都是 shell 变量,但唯一属于环境变量的 shell 变量是 shell 从其父进程的环境继承的变量或已使用内置命令导出的变量export

如果你运行的程序需要继承ZONEINSTANCE_NAME进入他们的环境,您确实需要将它们导出为环境变量。如果您甚至在~/.bashrc未获取来源的上下文中也需要这样做(例如,正在运行的脚本),那么将这些环境变量放入 中是不够的~/.bashrc

否则,它们可能只是 shell 变量,如上所示。shell 仍会找到它们并执行参数扩展在它们上面,通过扩展gc别名生成的命令。


无论你做什么,我建议你将别名定义修改为双引号那些变量当执行参数扩展时. 一种方法是像这样定义别名:

alias gc='gcloud compute ssh --zone="$ZONE" "jupyter@$INSTANCE_NAME" -- -L 8080:localhost:8080'

鉴于你所展示的初始值,只有在$IFS有一个不寻常的值,因为它们既不包含空格,也不包含任何通配符,如*。但执行不带引号的参数扩展是一种不好的做法除非你真的打算为了单词拆分或者通配符发生。

更重要的是,如果重新分配这些变量,则在运行别名扩展为的命令时将使用新值。别名仍将扩展为相同的命令(它扩展为的命令不依赖于这些变量的值),但后续对$ZONE和执行的参数扩展$INSTANCE_NAME将把它们扩展为新值。用双引号引起这些扩展可以防止变量故意包含空格(或 中的任何内容)或 、 和 中的任何内容时出现错误行为。但$IFS即使您相信或知道它们永远不应该采用这样的值,您也应该这样做,因此如果它们意外被赋予这样的值,您会收到可理解的错误消息,而不是奇怪和意外的行为。*?[

如果你实际上不希望这些变量存在根本,并且您只是使用它们来使定义gc更加自文档化,那么您可以将其定义gc为函数(在~/.bashrc)而不是别名,并使其成为局部变量:

gc() {
    local ZONE="us-eastern1-c"
    local INSTANCE_NAME="myInstance"
    gcloud compute ssh --zone="$ZONE" "jupyter@$INSTANCE_NAME" -- -L 8080:localhost:8080
}

相关内容