$ 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
ฉันถือว่าไดเรกทอรีมีอยู่ใช่ไหม
Beat Bolli

@njsg มันเป็นทุบตี

อาจเป็นอย่างอื่นกำลังรีเซ็ตตัวแปร PATH ของคุณหลังจากที่เรียกใช้แล้ว คุณสามารถตรวจสอบได้โดยใช้การ-xตั้งค่าสถานะที่ส่งผ่านไปยัง bash และดูตำแหน่งที่ PATH ถูกรีเซ็ต นอกจากนี้คุณจะต้องexport PATH="$HOME/bin:$PATH"ให้มันกับกระบวนการที่ตามมา
Charles Addis

คำตอบ:


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แทนที่จะเป็นไฟล์อื่น การตั้งค่าส่วนตัวและดูเหมือนว่าจะน่าเชื่อถือมากขึ้นเช่นกัน


แม้ว่าผู้ถามจะไม่ได้ระบุว่าเชลล์ตัวใดมีความเป็นไปได้ที่จะไม่ใช้เชลล์เป้าหมายอีกครั้ง แน่นอนคนอื่น ๆ ที่มีคำถามเดียวกันนี้อาจจะไม่
JdeBP

@JdeBP: เพิ่มความกระจ่างที่จะตอบ สันนิษฐานว่าเป็นผู้ใช้ Debian พวกเขาไม่ได้เปลี่ยนเชลล์แบบโต้ตอบเริ่มต้น แต่ฉันเดาว่าพวกเขาจะมีได้
Tigger

ผมไม่ได้มีส่วนใดของมิได้~/.bash_profile ~/.bash_loginที่ฉัน~มีเพียง.bash_historyและ.bash_logout(และแน่นอน.profile)

@Tigger อัพเดทแล้ว!

@ นักเรียน: ทำการอัปเดตอีกครั้ง ที่สูญเสียจริง ๆ กับสิ่งที่เกิดขึ้น ~/.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 ฉันกำลังทำทั้งสองอย่างและฉันกำลังใช้ยามรวมอยู่ ( [ -z "$has___profile" ] || return; has__profile=1) ดังนั้นฉันจึงไม่มีลูปไม่สิ้นสุดและทั้งสอง.profileและ.bashrc(เฉพาะเมื่อมีการกำหนด BASH_VERSION) ไม่ว่าฉันจะไปถึงที่นั่นได้อย่างไร
PSkocik

ฉันเข้าใจแล้ว ! ภาษาอังกฤษที่ไม่ดีของฉันผลักให้ฉันถามคำถามที่ไม่ต้องการนี้ (การใส่รหัสสำหรับการอธิบายดีกว่าการแสดงออกตามตัวอักษร) ขอบคุณสำหรับเวลาของคุณ :-)
Jonah

bash -lโหลดง่ายจะ.profile(ยกเว้นการกำหนดค่าแปลก ๆ ) นอกจากนี้เส้นทางควรจะตั้งอย่างถูกต้องเมื่อใช้บันทึกในซึ่งหมายความว่าใน "ผู้จัดการการแสดงผล" (DM) ในการใช้งาน: คำพังเพย, KDE, Xfce, LXDE ฯลฯ .
ไอแซก

1

หากคุณต้องการ.profileโหลดทั้งหมดที่คุณต้องการคือการเริ่มต้นเปลือกเข้าสู่ระบบ:

$ bash -l

นั่นควรจะเพียงพอสำหรับเซสชันที่กำลังทำงานอยู่ คุณสามารถเปรียบเทียบ PATH ก่อนและหลังการทุบตีเข้าสู่ระบบได้เริ่มขึ้นเพื่อยืนยันความแตกต่าง

สำหรับวิธีการแก้ปัญหาที่ถาวรมากขึ้นคุณต้องให้เชลล์ล็อกอินเริ่มทำงาน ณ จุดใดจุดหนึ่งก่อนเทอร์มินัล (คอนโซล) ของคุณจะเริ่ม การเข้าสู่ระบบในฐานะผู้ใช้เฉพาะเกิดขึ้นในบาง DM (ผู้จัดการการแสดงผล) (gnome, kde, xfce, lxde, ฯลฯ ) มันควรจะเป็นงานของพวกเขาใด ๆ ที่จะเปลี่ยนเส้นทางตัวแปรสภาพแวดล้อมเพื่อให้ตรงกับความต้องการของคุณ

ตัวอย่างเช่นสำหรับ 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"

สำหรับคำพังเพยมันก็ดูเหมือนว่าไฟล์มีการเปลี่ยนแปลง~/.pam_environmentคือ

และสำหรับ KDE ให้ทำตามคำแนะนำนี้เพื่อสร้างไฟล์คุณอาจใช้รหัสนี้:

$ file='$HOME/.config/plasma-workspace/env/path.sh'
$ code='export PATH=$HOME/bin:$PATH'
$ echo "$code" >> "$file"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.