$ HOME / bin目录不在$ 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

为什么这不起作用?(我的shell是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 '17

2
我认为目录存在,对吗?
Beat Bolli

@njsg这是bash

运行此命令后,可能有其他原因重置了您的PATH变量。您可以使用-x传递给bash 的标志并查看PATH的重置位置来进行验证。另外,您需要将export PATH="$HOME/bin:$PATH"其提供给后续流程。
查尔斯·亚迪斯

Answers:


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 '17

@JdeBP:添加了澄清的答案。假设作为Debian用户,他们没有更改默认的交互式shell,但我想他们可以更改。
跳跳虎

我没有任何~/.bash_profilenor ~/.bash_login。在我~这里只有.bash_history.bash_logout(当然还有.profile)。

@Tigger更新了!

@student:进行了另一个更新。关于发生的事情真是茫然。很想听听您是否知道为什么~/.profile被跳过。
跳跳虎

6

内购外壳启动文件规则很复杂.profile在X会话中打开新终端时,可能没有包含您的设置(尝试将其echo .profile放入内部,.profile并在启动Shell时查看消息是否显示)。

.  "$HOME/.profile"

应该手动重新加载配置文件。

登录和注销X也会导致.profile加载。

另外,您可以. $HOME/.profile.bashrc(在使用基于变量的防护措施以防止重复包含的同时)确保.profile在每次启动Shell时始终将其包含在内。

(你不应该需要export PATHPATH已经是导出的变量,并修改它的值不会改变其export状态。)


从.bashrc采购.profile!在大多数情况下,.profile包含`。.bashrc`,这不会陷入无限循环吗?
约拿(Jonah)

@youness我正在同时使用并且都使用include Guards([ -z "$has___profile" ] || return; has__profile=1),所以无论我怎么到达那里,都不会遇到无限循环,而且也不会(.profile并且.bashrc只有在定义了BASH_VERSION的情况下)都没有无限循环。
PSkocik '17

我知道了 !我的英语不好,使我问了一个没问题的问题(放置解释代码比文字表达更好)。感谢您的时间:-)
约拿(Jonah)

一个简单的bash -l将加载.profile(除非一些奇怪的配置)。另外,用户登录时应正确设置PATH。这意味着在使用的“显示管理器”(dm)中:gnome,KDE,xfce,lxde等。–
Isaac

1

如果要.profile加载,只需启动一个登录shell:

$ bash -l

对于正在运行的会话,这应该足够了。您可以在开始登录bash之前和之后比较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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.