设置 shell

设置 shell

XDG 基础目录规范提供一组目录,用于存储以前存放在用户文件夹中所谓的点文件/目录中的数据。本文旨在帮助希望尽可能多使用这些目录的用户。

答案1

事实上,目前对这个问题的简短回答是你不能,因为有些应用程序对路径进行硬编码。尽管如此,许多不专门支持 XDG 目录的应用程序允许通过环境变量设置其他目录。有时您需要能够更改系统范围的配置,例如使用 shell,但大多数时候,您应该能够以非特权用户身份执行该步骤。

设置 shell

# Setting bash to use $XDG_CONFIG_HOME/bash, defaults to ~/.config/bash
confdir=${XDG_CONFIG_HOME:-$HOME/.config}/bash

### Moving existing files
mkdir -p -- "$confdir"
for file in "$HOME"/.bash*; do
    dest=$confdir/$(basename "${file:1}") 
    mv -i -- "$file" "$dest" # don't overwrite without permission
done

### Sourcing and setting variables
sudo sh -c 'cat >>/etc/profile.d/bash_in_xdg_config_home.sh <<CONF
# Make bash follow the XDG_CONFIG_HOME convention
_confdir=\${XDG_CONFIG_HOME:-\$HOME/.config}/bash
if [ -d "$_confdir" ] &&  [ "\$0" = "bash" ]
then
    . "\$_confdir"/bash_profile
    . "\$_confdir"/bashrc
    HISTFILE=\$_confdir/bash_history
fi
unset _confdir
CONF
'

sudo sh -c 'cat >>/etc/bash.bash_logout <<CONF
if [ -s "\${XDG_CONFIG_HOME:-\$HOME/.config}/bash/bash_logout" ]
then
    . "\${XDG_CONFIG_HOME:-\$HOME/.config}/bash/bash_logout"
fi
CONF
'

# Setting zsh
## System wide configuration (using xdg directories)
sudo sh -c 'cat >>/etc/zshenv <<CONF
if [[ -d "\${XDG_CONFIG_HOME:-\$HOME/.config}"/zsh ]]
then
        export ZDOTDIR=\${XDG_CONFIG_HOME:-\$HOME/.config}/zsh
fi
CONF
'

如果您使用多个 shell,例如 zsh 用于交互式 shell,但另一个用于脚本,您可能需要一个$XDG_CONFIG_HOME/profile文件,您将在相关的 shell 初始化脚本中获取该文件。

设置环境变量

# bazaar
export BZRPATH=$XDG_CONFIG_HOME/bazaar
export BZR_PLUGIN_PATH=$XDG_DATA_HOME/bazaar
export BZR_HOME=$XDG_CACHE_HOME/bazaar

# gnupg
export GNUPGHOME=${XDG_CONFIG_HOME}/gnupg

# ICEauthority
export ICEAUTHORITY=${XDG_CACHE_HOME}/ICEauthority

#  less
export LESSHISTFILE="${XDG_CONFIG_HOME}/less/history"
export LESSKEY="${XDG_CONFIG_HOME}/less/keys"



# mplayer
export MPLAYER_HOME=$XDG_CONFIG_HOME/mplayer

# subversion
export SUBVERSION_HOME=$XDG_CONFIG_HOME/subversion


# vim
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'
export VIMDOTDIR="$XDG_CONFIG_HOME/vim"

解决方法

SSH

SSH 确实提供了一种更改客户端配置文件的方法,但据我所知,只能通过命令行。因此,始终使用非默认位置调用客户端的一种解决方案可能是:

if [ -s "${XDG_CONFIG_HOME}/ssh/config" ]
then
    SSH_CONFIG="-F ${XDG_CONFIG_HOME}/ssh/config"
fi
if [ -s "${XDG_CONFIG_HOME}/ssh/id_dsa" ]
then
    SSH_ID="-i ${XDG_CONFIG_HOME}/ssh/id_dsa"
fi

alias ssh="ssh $SSH_CONFIG $SSH_ID "
alias ssh-copy-id="ssh-copy-id $SSH_ID"

你的文件${XDG_CONFIG_HOME}/ssh/config中应该包含类似这样的内容:

Host *
    IdentityFile /home/user/.config/ssh/id_dsa
    UserKnownHostsFile /home/user/.config/ssh/known_hosts

尚无进展

虽然是一个记录的变量,但是在 Fedora 21 下,当您启动新会话时,GNUPGHOME您最终会创建一个新目录。~/.gnupg

虽然ICEauthority是一个记录的变量,但是在 Fedora 21 下,当您启动新会话时,您最终会创建一个新的 cookie。

点文件~/.swt内容可能应该直接存储到 中${XDG_DATA_HOME},因为两者都有lib目录。如果可能的话,没有找到关于如何做到这一点的文档。

Mozilla产品不支持适当的环境变量,请参阅Mozilla 产品不允许使用自定义用户配置目录支持 Freedesktop.org XDG 基础目录规范

其他有用资源

答案2

我建议查阅 Arch Linux 维基页面XDG 基本目录支持并不断更新。

胃肠道疾病

我刚刚将我的移至.gitconfigOSX XDG_CONFIG_HOME。根据 git-config 文档(由于声誉不佳,省略了链接)。

Second user-specific configuration file. If $XDG_CONFIG_HOME is not set or
empty, $HOME/.config/git/config will be used. Any single-valued variable 
set in this file will be overwritten by whatever is in ~/.gitconfig. It is
a good idea not to create this file if you sometimes use older versions of
Git, as support for this file was added fairly recently.

我使用中的说明设置了环境变量在 Mavericks 中设置系统范围的 PATH 环境变量。请注意,您需要XDG_CONFIG_HOME/git/config自己创建该文件,如果~/.gitconfig存在,它将优先。

VIM

我使用了 Tom Vincent 2011 年的文章Vim 尊重 XDG并且它似乎有效。我不确定上面的答案;VIMDOTDIR似乎没什么用。

答案3

Zsh 比 bash 做得更好,它让你可以使用变量来整理你的主页$ZDOTDIR。要移除 zsh,你需要将以下内容添加到你的~/.zshenv文件中:

# ~/.zshenv contents
# this is the bare bones setup to move everything to XDG dir
ZDOTDIR=$HOME/.config/zsh

如果您拥有 root 权限,则可以将其添加到,从而/etc/zsh/zshenv避免在 $HOME 中放置任何 zsh 点文件。从这里,您所有其他 zsh 点文件都可以移动到~/.config/zsh,例如.zshrc。我还建议将您的 zsh 历史记录添加到以下$XDG_DATA_HOME位置:HISTFILE=$XDG_DATA_HOME/zsh/zsh_history

有些应用程序会默认查找 XDG 位置,而您可能甚至没有意识到这一点,因为您的 $HOME 目录中仍有一个旧点文件。Git 就是一个很好的例子 - 如果您有一个~/.gitconfig,请尝试将其移动到~/.config/git/config。我个人最喜欢的是鱼壳,默认也使用 ~/.config。

另外,检查其他应用程序是否有自己的 re-$HOME 变量版本。许多应用程序通过变量支持它 XDG:

  • 原子:export ATOM_HOME=$XDG_CONFIG_HOME/atom
  • 密码:export LPASS_HOME=$XDG_CONFIG_HOME/lpass
  • rupa/z 有一个:export _Z_DATA=$XDG_DATA_HOME/z/z.txt

但是 XDG 耻辱墙仍然相当广泛。Tmux 一直积极采取敌对行动支持清理你的 $HOME。与 pylint 相同还有朱莉娅。 而这样的例子不胜枚举。Arch 在此处保存了 XDG 支持的良好运行列表

说实话,我无法理解为什么有人反对支持它。用户需要明确地发出一个明确的信息,即应用程序不应该肆意破坏他们的 $HOME。现在这样已经不行了。现代系统使用数百个污染 $HOME 的应用程序,而不是像 20 年前那样只有数十个。

答案4

我发现的最完整的清理主目录的资源是xdg-忍者。这是一个检查主目录中的点文件和目录的工具,并打印出如何配置每个软件的解决方案列表,这些软件会占用主目录。当然,它并不了解每一个软件(而且还有没有解决方案对于某些人来说!1),但它是迄今为止最完整的个人列表,并且该工具接受尚未缺少的工具的拉取请求。


1缺少一个无人维护的 hackLD_PRELOAD

相关内容