Del*_*aIV 7 command-line bash alias environment-variables bashrc
我希望每次打开 shell 时都可以使用以下别名:
export ZONE="us-eastern1-c"
export INSTANCE_NAME="myInstance"
alias gc='gcloud compute ssh --zone=$ZONE jupyter@$INSTANCE_NAME -- -L 8080:localhost:8080'
Run Code Online (Sandbox Code Playgroud)
我应该把它放进去.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
Run Code Online (Sandbox Code Playgroud)
那么,这里的最佳做法是什么?我应该将别名(和所需的环境变量)放在第三个文件中.bash_aliases吗?我不是配置文件扩散的忠实粉丝,但如果使用这.bash_aliases是最佳实践,我会这样做。
TL;DR:根据你给出的描述,它可以全部进入
~/.bashrc,即使你通常不想把环境变量放在那里。您可能还需要进行一些其他更改:导出变量可能是不必要的,最好引用它们的扩展。
与一般猛砸别名,你可以把你gc的别名在~/.bashrc或~/.bash_aliases,但它应该不进去.profile。如果变量只在别名(扩展为使用它们的命令)可用的 shell 中需要,那么将它们与别名放在同一位置实际上很好。
在这种情况下,我建议将别名和变量放在 中~/.bashrc,因为虽然可以将任何命令~/.bash_aliases放在自己)并激励他们怀疑自己是否在看错误。当然,您可以将别名放入~/.bash_aliases并将相关变量放入 中~/.bashrc,但我认为这会更加混乱。
通常不应将环境变量放入~/.bashrc. 大多数情况下,用户特定的环境变量应该使用in ~/.pam_environment,它使用自己的特殊语法,或者~/.profile,它包含 shell 命令~/.bashrc。(另请参阅这些评论。)原因之一是这些方法导致环境变量在大多数可能需要的情况下可用,而将其放入~/.bashrc无法实现;原因一说是~/.bashrc仅由bash,当你登录图形,这不是bash。但是,当您只需要使用变量的别名时才需要变量时,这并不适用。
尽管如此,我怀疑这实际上也不例外。但是不需要去其他地方而不是.bashrc,看起来这些变量不需要是环境变量。也就是说,看起来您不必导出它们,而可以简单地编写:
ZONE="us-eastern1-c"
INSTANCE_NAME="myInstance"
Run Code Online (Sandbox Code Playgroud)
这是关于shell 变量和环境变量之间的区别。在像 Bash 这样的 Bourne 风格的 shell 中,所有的环境变量都是 shell 变量,但唯一是环境变量的 shell 变量是那些 shell 从其父进程的环境中继承的或者已经用export内置函数导出的。
如果您运行的程序需要继承ZONE并INSTANCE_NAME进入它们的环境,那么您确实需要将它们作为环境变量导出。如果您需要,即使在~/.bashrc没有来源的上下文中(例如,运行脚本),那么将这些环境变量放在~/.bashrc.
否则,它们可以只是 shell variables,如上所示。在通过扩展别名生成的命令中,shell 仍然会找到它们并对它们执行参数扩展gc。
无论您做什么,我都建议您修改别名定义,以便在执行参数扩展时用双引号引用这些变量。一种方法是像这样定义别名:
alias gc='gcloud compute ssh --zone="$ZONE" "jupyter@$INSTANCE_NAME" -- -L 8080:localhost:8080'
Run Code Online (Sandbox Code Playgroud)
鉴于您显示的它们的初始值,只有在$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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3981 次 |
| 最近记录: |