Как использовать каталоги и пути XDG в Bash?

9

Интересно, как получить доступ не только к переменным, определенным в ~/.config/user-dirs.dirswith xdg-user-dir, например "$(xdg-user-dir VIDEOS)", но и к следующим стандартным переменным:

  1. XDG_CACHE_HOME:-$HOME/.cache
  2. XDG_CONFIG_HOME:-$HOME/.config
  3. XDG_DATA_HOME:-$HOME/.local/share
  4. XDG_RUNTIME_DIR:-"/run/user/$USER"
  5. XDG_CONFIG_DIRS:-/etc/xdg
  6. XDG_DATA_DIRS:-/usr/local/share:/usr/share

Для этого я делаю следующее в моем ~/.bash_loginфайле:

# Define standard directories.
declare -gx XDG_CACHE_HOME=~/.cache
declare -gx XDG_CONFIG_HOME=~/.config
declare -gx XDG_DATA_HOME=~/.local/share
declare -gx XDG_RUNTIME_DIR="/run/user/$USER"
declare -gx XDG_CONFIG_DIRS="$(IFS=: path /etc/xdg)"
declare -gx XDG_DATA_DIRS="$(IFS=: path /usr/local/share:/usr/share)"
# Source supplementary directories to export or overwrite existing standard ones.
declare a="$XDG_CONFIG_HOME/user-dirs.dirs"
if [[ -e $a ]]; then
  source "$a"
  declare b=""
  for b in ${!XDG_*}; do
    if [[ $b =~ ^XDG_[_[:alnum:]]+_DIR$ ]]; then
      declare -gx "$b"
    fi
  done
fi

Существует ли механизм доступа к указанным выше переменным каталога и пути, кроме переменных каталога пользователя, определенных в спецификации структуры каталога "XDG"?

Тим Фриске
источник
1
Это на самом деле число:XDG_RUNTIME_DIR:-"/run/user/$UID"
Том Хейл

Ответы:

4

Эти переменные среды являются необязательными. Если они не установлены, то ваш скрипт должен заменить значения по умолчанию, указанные в самой спецификации .

someprog --cachedir "${XDG_CACHE_HOME:-$HOME/.cache}"
Игнасио Васкес-Абрамс
источник
2
Эта возможность является одной из основных причин, почему я определяю их один раз как переменные среды, потому что я не хочу повторять значение по умолчанию при каждом "${XDG_CACHE_HOME:-~/.cache}"доступе. Оптимально должен существовать такой же механизм, как и при "$(xdg-user-dir VIDEOS)"неявном предоставлении этого значения по умолчанию. Таким образом, мне не нужно запоминать значение по умолчанию для каждой переменной XDG.
Тим Фриске
3
@ Тим Фриске: обратите внимание, что "${XDG_CACHE_HOME:-~/.cache}"это неправильно, следует использовать "${XDG_CACHE_HOME:-$HOME/.cache}"вместо этого.
Flimm
0

Плюс настройки по умолчанию:

man xdg-user-dir=> СМОТРИТЕ ТАКЖЕ: xdg-user-dirs-update(1)

man xdg-user-dirs-update=> СМОТРИТЕ ТАКЖЕ: user-dirs.defaults(5)

man user-dirs.defaults=> user-dirs.defaultsПри первом XDG_CONFIG_DIRS( по умолчанию: /etc/xdg)

Так:

read -r -d : <<<"${XDG_CONFIG_DIRS:=/etc/xdg}" XDG_USER_DIRS_DEFAULTS
XDG_USER_DIRS_DEFAULTS+=/user-dirs.defaults
Luchostein
источник