Bash - 文件局部变量

时间:2016-09-18 11:55:41

标签: bash prompt .bash-profile ps1

我刚写了一个小文件来设置我的PS1变量。此文件来自我的 .bashrc 。现在我对这种方法有几个问题。

但首先是代码:

setprompt

# 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启动速度吗?我应该写一个难看的丑陋代码而不是做这些变量定义/采购吗?
  • 我注意到, 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)

1 个答案:

答案 0 :(得分:1)

保持人类可读的东西可能是一件好事,如果性能是一个问题,如果你的提示已经设置,也许你可以控制它是否会被执行。作为第一步,可以将呼叫转移到.bash_profile而不是.bashrc

您可以unset脚本末尾的所有变量,或者重构脚本以使其作为函数运行,或者作为单独的脚本运行(即调用它而不是source它)。

如果你把它全部放在一个函数中,函数将需要声明所有变量local

如果您将其作为外部脚本运行,则需要对其进行更改,以便打印最终值。然后你可以像

一样调用它
PS1=$(setprompt)

没有任何副作用。 (也许你也想用一个函数来做这件事,只是为了让它保持干净和模块化。)