Bash - 文件局部变量
Bash - File local variables
我刚刚写了一个小文件来设置我的 PS1 变量。这个文件来源于我的.bashrc。现在我有几个关于这种方法的问题。
但首先是代码:
设置提示:
# Normal variables
BOLD="$(tput bold)"
RESET="$(tput sgr0)"
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
BLUE="$(tput setaf 4)"
PINK="$(tput setaf 5)"
CYAN="$(tput setaf 6)"
GRAY="$(tput setaf 7)"
# Make non-printable variables
PROMPT_BOLD="\[$BOLD\]"
PROMPT_RESET="\[$RESET\]"
PROMPT_RED="\[$RED\]"
PROMPT_GREEN="\[$GREEN\]"
PROMPT_YELLOW="\[$YELLOW\]"
PROMPT_BLUE="\[$BLUE\]"
PROMPT_PINK="\[$PINK\]"
PROMPT_CYAN="\[$CYAN\]"
PROMPT_GRAY="\[$GRAY\]"
# Other variables
USERNAME="\u"
FULL_HOSTNAME="\H"
SHORT_HOSTNAME="\h"
FULL_WORKING_DIR="\w"
BASE_WORKING_DIR="\W"
# Throw it together
FINAL="${PROMPT_RESET}${PROMPT_BOLD}${PROMPT_GREEN}"
FINAL+="${USERNAME}@${SHORT_HOSTNAME} "
FINAL+="${PROMPT_RED}${FULL_WORKING_DIR}$ "
FINAL+="${PROMPT_RESET}"
# Export variable
export PS1="${FINAL}"
.bashrc:
..
source ~/.dotfiles/other/setprompt
..
我的问题:
- 这种方法会减慢我的 bash 启动速度吗?我应该只写一行丑陋的不可读的代码而不是做这些变量 definitions/sourcing?
- 我注意到,在 setprompt 中定义的变量仍然在我的 .bashrc 中定义。我不喜欢这种行为,因为对于 .bashrc 的编辑来说,变量是在采购 setprompt 时定义的并不明显。这只是
source
的行为吗?我该怎么办?
编辑:
这是我现在使用的方法(tripleee推荐):
getPrompt.sh:
#!/bin/bash
getPrompt () {
# Bold/Reset
local PROMPT_BOLD="\[$(tput bold)\]"
local PROMPT_RESET="\[$(tput sgr0)\]"
# Colors
local PROMPT_RED="\[$(tput setaf 1)\]"
local PROMPT_GREEN="\[$(tput setaf 2)\]"
# Miscellaneous
local USERNAME="\u" local SHORT_HOSTNAME="\h"
local FULL_WORKING_DIR="\w"
# Print for later use
printf "%s%s%s%s" "${PROMPT_RESET}${PROMPT_BOLD}${PROMPT_GREEN}" \
"${USERNAME}@${SHORT_HOSTNAME} " \
"${PROMPT_RED}${FULL_WORKING_DIR}$ " \
"${PROMPT_RESET}"
}
.bashrc:
source ~/.dotfiles/bash/getPrompt.sh
PS1=$(getPrompt)
保持人类可读可能是一件好事,如果性能有问题,如果您的提示已经设置,也许您可以控制它是否完全执行。作为第一步,也许将调用移至 .bash_profile
而不是 .bashrc
.
您可以 unset
脚本末尾的所有变量,或重构脚本,使其 运行 作为一个函数,或作为一个单独的脚本(即改为调用它source
个)。
如果全部放在函数中,函数需要声明所有的变量local
。
如果您运行将其作为外部脚本,则需要对其进行更改,以便打印最终值。然后你可以这样称呼它
PS1=$(setprompt)
没有任何副作用。 (也许你也想用一个函数来做到这一点,只是为了保持它的整洁和模块化。)
我刚刚写了一个小文件来设置我的 PS1 变量。这个文件来源于我的.bashrc。现在我有几个关于这种方法的问题。
但首先是代码:
设置提示:
# Normal variables
BOLD="$(tput bold)"
RESET="$(tput sgr0)"
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
BLUE="$(tput setaf 4)"
PINK="$(tput setaf 5)"
CYAN="$(tput setaf 6)"
GRAY="$(tput setaf 7)"
# Make non-printable variables
PROMPT_BOLD="\[$BOLD\]"
PROMPT_RESET="\[$RESET\]"
PROMPT_RED="\[$RED\]"
PROMPT_GREEN="\[$GREEN\]"
PROMPT_YELLOW="\[$YELLOW\]"
PROMPT_BLUE="\[$BLUE\]"
PROMPT_PINK="\[$PINK\]"
PROMPT_CYAN="\[$CYAN\]"
PROMPT_GRAY="\[$GRAY\]"
# Other variables
USERNAME="\u"
FULL_HOSTNAME="\H"
SHORT_HOSTNAME="\h"
FULL_WORKING_DIR="\w"
BASE_WORKING_DIR="\W"
# Throw it together
FINAL="${PROMPT_RESET}${PROMPT_BOLD}${PROMPT_GREEN}"
FINAL+="${USERNAME}@${SHORT_HOSTNAME} "
FINAL+="${PROMPT_RED}${FULL_WORKING_DIR}$ "
FINAL+="${PROMPT_RESET}"
# Export variable
export PS1="${FINAL}"
.bashrc:
..
source ~/.dotfiles/other/setprompt
..
我的问题:
- 这种方法会减慢我的 bash 启动速度吗?我应该只写一行丑陋的不可读的代码而不是做这些变量 definitions/sourcing?
- 我注意到,在 setprompt 中定义的变量仍然在我的 .bashrc 中定义。我不喜欢这种行为,因为对于 .bashrc 的编辑来说,变量是在采购 setprompt 时定义的并不明显。这只是
source
的行为吗?我该怎么办?
编辑:
这是我现在使用的方法(tripleee推荐):
getPrompt.sh:
#!/bin/bash
getPrompt () {
# Bold/Reset
local PROMPT_BOLD="\[$(tput bold)\]"
local PROMPT_RESET="\[$(tput sgr0)\]"
# Colors
local PROMPT_RED="\[$(tput setaf 1)\]"
local PROMPT_GREEN="\[$(tput setaf 2)\]"
# Miscellaneous
local USERNAME="\u" local SHORT_HOSTNAME="\h"
local FULL_WORKING_DIR="\w"
# Print for later use
printf "%s%s%s%s" "${PROMPT_RESET}${PROMPT_BOLD}${PROMPT_GREEN}" \
"${USERNAME}@${SHORT_HOSTNAME} " \
"${PROMPT_RED}${FULL_WORKING_DIR}$ " \
"${PROMPT_RESET}"
}
.bashrc:
source ~/.dotfiles/bash/getPrompt.sh
PS1=$(getPrompt)
保持人类可读可能是一件好事,如果性能有问题,如果您的提示已经设置,也许您可以控制它是否完全执行。作为第一步,也许将调用移至 .bash_profile
而不是 .bashrc
.
您可以 unset
脚本末尾的所有变量,或重构脚本,使其 运行 作为一个函数,或作为一个单独的脚本(即改为调用它source
个)。
如果全部放在函数中,函数需要声明所有的变量local
。
如果您运行将其作为外部脚本,则需要对其进行更改,以便打印最终值。然后你可以这样称呼它
PS1=$(setprompt)
没有任何副作用。 (也许你也想用一个函数来做到这一点,只是为了保持它的整洁和模块化。)