如何清理我的bashrc / zshrc文件?


1

随着时间的推移,我已经在我的PATH中添加了一些东西,它看起来非常糟糕。我该如何清理它或者“重新格式化”所有这些的正确方法是什么?

export PATH="$PATH:~/scripts"
export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools/adb"
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools:~/Downloads/android-sdk-mac_x86/tools:~/Downloads/android-sdk-mac_x86/platform-tools/adb"
export PATH="$PATH:~/bin"
export PATH="$PATH:~/bin/subl"
export PATH="$PATH:~/.rvm/gems/ruby-1.9.3-head/gems/git-media-0.1.1/bin"

export PATH=$PATH:$HOME/bin:/Users/me/Downloads/android-sdk-mac_86/tools
export PATH=$PATH:$HOME/bin:/Users/me/Downloads/android-sdk-mac_86/platform-tools
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/.rvm/scripts/rvm:/.rvm/scripts/rvm:/~/Downloads/android-sdk-mac_x86/tools/android:/~/Downloads/android-ndk-r7/:/~/Downloads/android-sdk-mac_x86/platform-tools
export CC=gcc-4.2
export PATH=~/Downloads/android-ndk-r7:$PATH
ANDROID_HOME=~/Downloads/android-sdk-mac_x86
export PATH=${PATH}:$ANDROIDHOME/platform-tools

3
我不明白这个问题。删除不再需要的行。完成。
Der Hochstapler

Answers:


3

在Bash中,您只需要导出一次变量,而不是每次分配。从然后放置所有PATH分配中的导出 export PATH 最后在一条线上。如果您只是将变量设置一次,就像使用CC一样,那么在它前面导出就可以了。您也可以使用单个命令导出它们,例如with export PATH CC ANDROID_HOME

Bash的分发tarball附带了几个便利函数,用于在变量前添加或附加路径。我认为它们位于名为“pathfuncs”的contrib文件中。它们可以使您的rc文件更具可读性。

  • add_path将条目添加到PATH变量的末尾
  • pre_path会将条目添加到PATH变量的开头
  • del_path将从PATH变量中删除条目,无论它在何处

如果指定变量作为第二个参数,它将使用该变量而不是PATH。

为方便起见,这里是:

# is $1 missing from $2 (or PATH) ?
no_path() {
    eval "case :\$${2-PATH}: in *:$1:*) return 1;; *) return 0;; esac"
}
# if $1 exists and is not in path, append it
add_path () {
  [ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="\$${2:-PATH}:$1"
}
# if $1 exists and is not in path, prepend it
pre_path () {
  [ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="$1:\$${2:-PATH}"
}
# if $1 is in path, remove it
del_path () {
  no_path $* || eval ${2:-PATH}=`eval echo :'$'${2:-PATH}: |
    sed -e "s;:$1:;:;g" -e "s;^:;;" -e "s;:\$;;"`
}

如果将这些添加到bash启动文件中,则可以像这样添加到PATH:

pre_path $HOME/bin
add_path /sbin
add_path /usr/sbin

或者指定一个不同的变量:

pre_path $HOME/man MANPATH
pre_path $HOME/share/man MANPATH
add_path /usr/local/man MANPATH
add_path /usr/share/man MANPATH

我在我的rc文件中使用此方法,首先放置pre_paths,然后放入add_paths。它使我的所有路径变化都很容易理解。另一个好处是线条足够短,我可以在必要时在一行上添加一个尾随注释。

由于这些是函数,您可以从命令行以交互方式使用它们,例如说 add_path `pwd` 将当前目录添加到路径。


编辑: 用上面的函数修复你提供的rc文件,我有这个:

pre_path /opt/local/bin
pre_path /opt/local/sbin
pre_path ~/Downloads/android-ndk-r7

add_path ~/scripts
add_path ~/Downloads/android-sdk-mac_x86/platform-tools
add_path ~/Downloads/android-sdk-mac_x86/tools
add_path ~/Downloads/android-sdk-mac_x86/platform-tools/adb
add_path ~/bin
add_path ~/bin/subl
add_path ~/.rvm/gems/ruby-1.9.3-head/gems/git-media-0.1.1/bin
add_path $HOME/bin
add_path /Users/me/Downloads/android-sdk-mac_86/tools
add_path /Users/me/Downloads/android-sdk-mac_86/platform-tools
add_path /usr/local/bin
add_path /usr/bin
add_path /bin
add_path /usr/sbin
add_path /sbin
add_path /usr/X11/bin
add_path /.rvm/scripts/rvm
add_path /.rvm/scripts/rvm
add_path /~/Downloads/android-sdk-mac_x86/tools/android
add_path /~/Downloads/android-ndk-r7/
add_path /~/Downloads/android-sdk-mac_x86/platform-tools

ANDROID_HOME=~/Downloads/android-sdk-mac_x86
add_path $ANDROID_HOME/platform-tools

export PATH
export CC=gcc-4.2

你需要做一些清理工作来删除重复项并将事情放在更好的顺序中。


1

你不需要这个

export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools/adb"

因为adb是一个可执行文件。

在这:

export PATH="$PATH:~/Downloads/android-sdk-mac_x86/platform-tools:~/Downloads/android-sdk-mac_x86/tools:~/Downloads/android-sdk-mac_x86/platform-tools/adb"

你可以摆脱结肠后的东西(重复上面的adb)。

在这:

出口

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:/.rvm/scripts/rvm:/.rvm/scripts/rvm:/~/Downloads/android-sdk-mac_x86/tools/android:/~/Downloads/android-ndk-r7/:/~/Downloads/android-sdk-mac_x86/platform-tools

你正在重复平台工具(最后一个条目)和android(第二个最后一个条目)。

尝试将每个PATH添加到一行,所有重复都会跳出来。


1

您可以将所有路径修改放在一行中,例如:

export PATH="$PATH:~/scripts:~/bin:~/bin/subl"

等,但这不会使它更具可读性。

但是,在第11行中,您或多或少地执行上述操作。至少你取消了第1-10行所做的所有路径更改,所以你可以删除第1-10行。然后您可以稍后合并 $PATH 更改以将其包含在一行中,但正如我所说,它将是一条难以理解的行。


1

只是一个简单的想法:我可能写这样的东西:

function addpath() {
    [[ -d "$1" ]] || return 1

    print -rl ${(s.:.)PATH} | grep -q "$1"
    [[ $? != 0 ]] || return 1

    path+="$1"
}

然后我将每个运行此zsh配置的机器的路径(由换行符分隔)放在一个文件中,例如, .zsh/paths.d/host1 并在所选文件的每一行上应用此函数...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.