$ HOME / bin dir отсутствует в $ PATH

11

По моему у ~/.profileменя есть последний блок, который должен загрузить мои личные, bin/ directoryкак это:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Но, похоже, не загружено:

echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Почему это не работает? (Моя оболочка bash.)

Редактировать для тигра

echo $0 => bash

echo $HOME => /home/student

whoami => student

less /etc/*-release => 
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Крис Тан
источник
Для получения дополнительной информации об этой части .profileсм. Askubuntu.com/questions/284640 .
JdeBP
Какая это оболочка?
njsg
2
Я предполагаю, что каталог существует, верно?
Бить Болли
@njsg это bash
Возможно, что-то еще сбрасывает переменную PATH после запуска. Вы можете проверить это, используя -xфлаг, переданный bash и увидев, где PATH сброшен. Также вам необходимо export PATH="$HOME/bin:$PATH"предоставить его для последующих процессов.
Чарльз Аддис

Ответы:

10

С вершины ~/.profile:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

Так (если вы используете в bashкачестве оболочки) Я предполагаю , что либо ~/.bash_profileили ~/.bash_loginв вашей системе. Выберите один и отредактируйте его, чтобы включить:

export PATH=$PATH:$HOME/bin

Затем сохраните и / source ~/.bash_loginили выйдите из системы и снова войдите в систему.

Редактировать :

Вы говорите, что оба ~/.bash_profileи ~/.bash_loginоба отсутствуют в вашем $HOME. Я думаю, что нам нужно подтвердить несколько вещей. Пожалуйста, опубликуйте результаты следующего в вашем оригинальном вопросе:

echo $0
echo $HOME
whoami
less /etc/*-release

Изменить 2 :

Лично я не знаю, почему ~/.profileне включается в ваше дело на основании предоставленной информации и документации. Во время тестирования я заметил, что мой ~/.profileсканируется при входе, sshно не при запуске нового терминала.

Но есть простое решение, позволяющее $HOME/binбыть включенным в вашу интерактивную оболочку. Отредактируйте (создайте, если не присутствует) ~/.bashrcи добавьте в него следующую строку:

export PATH=$PATH:$HOME/bin

Сохранить, выйти и снова войти в систему, или source ~/.bashrc.

exportЛиния может быть расширена , чтобы проверить, $HOME/binсуществует ли вам нравится с:

if [ -d "$HOME/bin" ]
then
    export PATH=$PATH:$HOME/bin
fi

Почему ~/.bashrcвместо другого файла? Личные предпочтения и, кажется, более надежны.

Tigger
источник
Хотя, поскольку спрашивающий не указал, какую оболочку, существует также вероятность того, что вы вообще не используете оболочку Bourne Again. Конечно, других людей с таким же вопросом не может быть.
JdeBP
@JdeBP: добавлено пояснение к ответу. Будучи пользователем Debian, они не меняли свою интерактивную оболочку по умолчанию, но, думаю, могли.
Тигр
У меня нет ни того, ~/.bash_profileни другого ~/.bash_login. На мой ~есть только .bash_historyи .bash_logout(и конечно же .profile).
@Tigger обновлен!
@student: сделал еще одно обновление. Действительно в растерянности относительно того, что происходит. Довольно интересно услышать, если вы узнаете, почему ~/.profileпропускается.
Тигр
6

В правила интернализация Стартовые файлы оболочки сложны . Вполне вероятно, что с вашей настройкой, .profileне включается, когда вы открываете новый терминал в сеансе X (попробуйте поместить echo .profileвнутрь .profileи посмотреть, появляется ли сообщение при запуске оболочки).

.  "$HOME/.profile"

следует перезагрузить профиль вручную.

Вход и выход из X также должен вызывать .profileзагрузку.

Кроме того, вы можете сделать . $HOME/.profileиз .bashrc(при использовании защиты на основе переменных для предотвращения двойного включения), чтобы убедиться, что .profileвсегда включен, когда вы запускаете оболочку.

(Вам не нужно, export PATHпоскольку PATHэто уже экспортированная переменная, и изменение ее значения не изменит ее exportстатус.)

PSkocik
источник
источник .profile от .bashrc! в большинстве случаев .profile содержит `. .bashrc`, это не пойдет в бесконечный цикл ?!
Иона
@youness Я делаю оба и использую include guards ( [ -z "$has___profile" ] || return; has__profile=1), поэтому я не получаю бесконечные циклы и оба, .profileи .bashrc(только если определен BASH_VERSION), независимо от того, как я туда попал.
PSkocik
я понял ! мой плохой английский подтолкнул меня задать этот ненужный вопрос (код для объяснения лучше, чем буквальное выражение). спасибо за ваше время :-)
Иона
Простое bash -lзагрузит .profile(если не какая-то странная конфигурация). Кроме того, PATH должен быть правильно установлен, когда пользователь входит в систему. Это означает, что в используемом «диспетчере отображения» (dm): gnome, KDE, xfce, lxde и т. Д.
Исаак
1

Если вы хотите .profileзагрузить все, что вам нужно, это запустить оболочку входа в систему:

$ bash -l

Этого должно быть достаточно для текущей сессии. Вы можете сравнить PATH до и после запуска входа в систему, чтобы подтвердить разницу.

Для более постоянного решения вам нужно, чтобы оболочка входа была запущена в какой-то момент до запуска вашего терминала (консоли). Вход в систему под определенным пользователем происходит через некоторый dm (менеджер дисплеев) (gnome, kde, xfce, lxde и т. Д.). Задача любого из них - изменить переменную окружения PATH в соответствии с вашими потребностями.

Например, для xfce решение состоит в том, чтобы изменить xinitrc:

$ cat >"$HOME/.config/xfce4/xinitrc" <<-\_EOT_
#!/bin/sh

# Ensure programs in ~/bin are available for the X session.
p="$HOME/bin";
[ "$p" != "${PATH%%:*}" ] && export PATH=$p:$PATH
_EOT_
cat "/etc/xdg/xfce4/xinitrc" | tail -n+2 >> "$HOME/.config/xfce4/xinitrc"

Для gnome кажется, что файл для изменения есть ~/.pam_environment.

А для KDE, следуйте этому руководству , чтобы создать файл, вы можете использовать этот код:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
Исаак
источник