随着时间的推移,我向 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
答案1
在 Bash 中,您只需导出变量一次,而不必在每次赋值时都导出。从所有 PATH 赋值中删除导出,然后export PATH
在末尾单独添加一行。如果您只设置一次变量(例如 CC),则在变量前面导出即可。您也可以使用单个命令(例如 with )导出它们export PATH CC ANDROID_HOME
。
Bash 的发行版 tarball 附带了几个方便的函数,用于将路径添加到变量的前面或后面。我认为它们位于名为“pathfuncs”的贡献文件中。它们可以使您的 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
您需要进行一些清理工作来删除重复项并让内容更加有序。
答案2
你不需要这个
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 添加放在一行上,所有重复项都会跳出来。
答案3
您可以将所有路径修改放在一行上,例如
export PATH="$PATH:~/scripts:~/bin:~/bin/subl"
等等,但这不会使其更具可读性。
但是,在第 11 行,您或多或少做了上述操作。至少您取消了第 1-10 行中所做的所有路径更改,因此您可以删除第 1-10 行。然后,您可以合并后续$PATH
更改以将其包含在一行中,但正如我所说,它将是一行难以理解的行。
答案4
只是一个快速的想法:我可能会写类似这样的内容:
function addpath() {
[[ -d "$1" ]] || return 1
print -rl ${(s.:.)PATH} | grep -q "$1"
[[ $? != 0 ]] || return 1
path+="$1"
}
然后,我会将运行此 zsh 配置的每台机器的路径(以换行符分隔)放在一个文件中,.zsh/paths.d/host1
然后将此功能应用于所选文件的每一行......