$ 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

Чому це не працює? (Моя шкаралупа баш.)

Редагувати для Tigger

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замість іншого файлу? Особисто вподобання, здається, і надійніше.


Хоча, оскільки запитуючий не вказав, яка оболонка, також існує ймовірність, що людина взагалі не використовує оболонку Bourne Again. Звичайно, інших людей з цим самим питанням може не бути.
JdeBP

@JdeBP: відповідь додана. Вважаючи, що користувач Debian, вони не змінили інтерактивну оболонку за замовчуванням, але, мабуть, могли.
Тигр

У мене немає якоїсь - або з ~/.bash_profileні ~/.bash_login. У мене ~є тільки .bash_historyі .bash_logout(і, звичайно, .profile).

@Tigger оновлено!

@student: Ще одне оновлення. Дійсно в збиток щодо того, що відбувається. Досить зацікавлено почути, якщо дізнаєтесь, чому ~/.profileпропускають.
Tigger

6

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

.  "$HOME/.profile"

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

Увійти та вийти з X також слід спричинити .profileзавантаження.

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

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


джерело .profile від .bashrc! у більшості випадків .profile містить `. .bashrc`, це не піде через нескінченну петлю ?!
Йона

@youness Я роблю і те, і я використовую include guards ( [ -z "$has___profile" ] || return; has__profile=1), тому я не отримую нескінченних циклів і обох, .profileі .bashrc(тільки якщо визначено BASH_VERSION) незалежно від того, як я туди потрапив.
PSkocik

зрозумів ! моя погана англійська мотивація підштовхнула мене до запитання цього непотрібного питання (ставити код для пояснення краще, ніж буквальне вираження). дякую за ваш час :-)
Jonah

Проста 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.