$ HOME / bin dir không có trên $ PATH


11

Trong tôi ~/.profilecó một khối cuối cùng sẽ tải cá nhân của tôi bin/ directorynhư thế này:

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

Nhưng nó dường như không được tải:

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

Tại sao cái này không hoạt động? (Vỏ của tôi là bash.)

Chỉnh sửa cho 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/"

Để biết thông tin cơ bản về phần này .profile, hãy xem Askubfox.com/questions/284640 .
JdeBP

Cái vỏ này là cái gì?
njsg

2
Tôi giả sử thư mục tồn tại, phải không?
Đánh bại Bolli

@njsg nó là bash

Có thể một cái gì đó khác đang đặt lại biến PATH của bạn sau khi nó được chạy. Bạn có thể xác minh bằng cách sử dụng -xcờ được chuyển đến bash và xem nơi PATH được đặt lại. Ngoài ra, bạn cần export PATH="$HOME/bin:$PATH"cung cấp nó cho các quá trình tiếp theo.
Charles Addis

Câu trả lời:


10

Từ đầu ~/.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.

Vì vậy (nếu bạn đang sử dụng bashlàm vỏ của mình) Tôi đoán ~/.bash_profilehoặc ~/.bash_loginlà trên hệ thống của bạn. Chọn một và chỉnh sửa nó để bao gồm:

export PATH=$PATH:$HOME/bin

Sau đó lưu và source ~/.bash_loginhoặc đăng xuất và đăng nhập lại.

Chỉnh sửa :

Bạn nói rằng cả hai ~/.bash_profile~/.bash_loginđều mất tích từ bạn $HOME. Tôi nghĩ rằng chúng ta cần xác nhận một vài điều. Vui lòng gửi kết quả sau đây trong câu hỏi ban đầu của bạn:

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

Chỉnh sửa 2 :

Cá nhân, tôi không biết tại sao ~/.profilekhông được đưa vào trường hợp của bạn dựa trên thông tin được cung cấp và tài liệu. Trong khi thử nghiệm tôi đã nhận thấy rằng tôi ~/.profileđược quét khi tôi sshvào nhưng không phải khi tôi khởi chạy một thiết bị đầu cuối mới.

Nhưng, có một giải pháp đơn giản để cho phép $HOME/binđưa vào vỏ tương tác của bạn. Chỉnh sửa (tạo nếu không có) ~/.bashrcvà thêm dòng sau vào nó:

export PATH=$PATH:$HOME/bin

Lưu, đăng xuất và đăng nhập lại, hoặc source ~/.bashrc.

Các exportdòng có thể được mở rộng để kiểm tra $HOME/bintồn tại nếu bạn thích với:

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

Tại sao ~/.bashrcthay vì một tập tin khác? Cá nhân ưa thích và dường như cũng đáng tin cậy hơn.


Mặc dù, vì người hỏi không chỉ định shell nào, nên cũng có khả năng người ta không sử dụng shell Bourne Again. Chắc chắn những người khác có cùng câu hỏi này có thể không.
JdeBP

@JdeBP: thêm làm rõ để trả lời. Được cho là một người dùng Debian, họ đã không thay đổi trình vỏ tương tác mặc định của họ, nhưng tôi đoán họ có thể có.
Kích hoạt

Tôi không có bất kỳ ~/.bash_profilehay ~/.bash_login. Tại tôi ~chỉ có .bash_history.bash_logout(và tất nhiên là .profile).

@Tigger cập nhật!

@student: Thực hiện cập nhật khác. Thực sự mất mát như những gì đang xảy ra. Khá thú vị để nghe nếu bạn tìm hiểu tại sao ~/.profileđang bị bỏ qua.
Kích hoạt

6

Các quy tắc cho các tập tin khởi động shell trong nguồn là phức tạp . Có thể với thiết lập của bạn, .profilesẽ không được bao gồm khi bạn mở một thiết bị đầu cuối mới trong phiên X (thử đặt echo .profilebên trong .profilevà xem thông báo có hiển thị khi bạn khởi động trình bao không).

.  "$HOME/.profile"

nên tải lại hồ sơ bằng tay.

Đăng nhập và thoát khỏi X cũng sẽ gây ra .profiletải.

Ngoài ra, bạn có thể làm . $HOME/.profiletừ .bashrc(trong khi sử dụng một người bảo vệ biến dựa trên để ngăn chặn bao gồm kép) để đảm bảo .profileluôn luôn bao gồm bất cứ khi nào bạn bắt đầu một vỏ.

(Bạn không nên cần phải export PATHnhư PATHđã là một biến xuất khẩu và sửa đổi giá trị của nó sẽ không thay đổi nó exporttrạng thái).


tìm nguồn cung ứng .profile từ .bashrc! trong hầu hết các trường hợp .profile chứa `. .bashrc`, điều này sẽ không nghĩ đến một vòng lặp vô tận?!
Giô-na

@youness Tôi đang làm cả hai và tôi đang sử dụng bao gồm các vệ sĩ ( [ -z "$has___profile" ] || return; has__profile=1) vì vậy tôi không nhận được các vòng lặp vô hạn và cả hai .profile.bashrc(chỉ khi BASH_VERSION được xác định) cho dù tôi có đến đó bằng cách nào.
PSkocik

Tôi hiểu rồi ! tiếng Anh không tốt của tôi đã thúc đẩy tôi đặt câu hỏi không cần thiết này, (đặt mã để giải thích tốt hơn biểu thức nghĩa đen). cảm ơn thời gian của bạn :-)
Jonah

Một đơn giản bash -lsẽ tải .profile(trừ khi một số cấu hình kỳ lạ). Ngoài ra, PATH phải được đặt chính xác khi người dùng đăng nhập. Điều đó có nghĩa là trong "trình quản lý hiển thị" (dm) đang sử dụng: gnome, KDE, xfce, lxde, v.v.
Isaac

1

Nếu bạn muốn được .profiletải tất cả những gì bạn cần là bắt đầu một vỏ đăng nhập:

$ bash -l

Điều đó là đủ cho một phiên chạy. Bạn có thể so sánh PATH trước và sau khi đăng nhập bash đã được bắt đầu để xác nhận sự khác biệt.

Đối với một giải pháp lâu dài hơn, bạn cần phải bắt đầu một vỏ đăng nhập tại một thời điểm trước khi thiết bị đầu cuối (bảng điều khiển) của bạn bắt đầu. Việc đăng nhập như một người dùng cụ thể xảy ra trên một số dm (trình quản lý hiển thị) (gnome, kde, xfce, lxde, v.v.). Nó sẽ là công việc của bất kỳ ai trong số họ để thay đổi biến môi trường PATH để phù hợp với nhu cầu của bạn.

Ví dụ, đối với xfce, giải pháp là thay đổi 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"

Đối với gnome, có vẻ như các tập tin để thay đổi~/.pam_environment.

Và đối với KDE, hãy làm theo hướng dẫn này , để tạo tệp, bạn có thể sử dụng mã này:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.