เส้นทางที่ซ้ำกันปัญหาเกี่ยวกับ. bash_profile

Aug 16 2020

ฉันถูกนำมาที่นี่จาก Stack Overflow หลังจากโพสต์คำถามเกี่ยวกับการดิ้นรนเพื่อให้ PyExifTool ทำงาน อย่างไรก็ตามดูเหมือนว่าปัญหานั้นมีหลายแง่มุมและการเป็นมือใหม่ฉันได้รับคำสั่งให้ขอความช่วยเหลือที่นี่

โดยพื้นฐานแล้วปัญหาเกิดขึ้นเมื่อฉันถูกบอกให้วิ่ง ...

bash:~ $ type -all exiftool

ซึ่งกลับมา ...

exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool

... เผยให้เห็นว่ามีรายการที่ซ้ำกันที่ไหนสักแห่ง

ต่อจากนั้นก็วิ่ง ...

bash:~ $ echo $PATH

ซึ่งกลับมา ...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

... ซึ่งมีรายการที่ซ้ำกันและไม่ควรลงท้ายด้วย .bash_profile

ตอนนี้ในเทอร์มินัลฉันสามารถทำความสะอาดได้โดยใช้ ...

bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')

ด้านบนเป็นตัวอย่างที่ฉันได้รับจากLinux Journalที่ควรจะ 'เกือบจะใช้งานได้' แต่ส่วนของโค้ดที่ 'ควรใช้งานได้' ดูเหมือนจะไม่ช่วยฉัน การใช้รหัส 'เกือบใช้งานได้' ให้สิ่งต่อไปนี้:

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile :

ฉันเป็นมือใหม่ แต่ฉันไม่คิดว่ามันควรจะจบลง :และเห็นได้ชัดว่า.bash_profileยังคงมีอยู่ อย่างไรก็ตามดูเหมือนว่าจะลบรายการที่ซ้ำกันออกแม้ว่าจะรีเซ็ตหากฉันเปิดหน้าต่างเทอร์มินัลใหม่ดังนั้นจึงเป็นเพียงวิธีแก้ปัญหาชั่วคราวเท่านั้น

นี่คือลักษณะของโปรไฟล์ทุบตีของฉัน:

export PATH=/usr/local/bin:$PATH~/.bash_profile # Setting PATH for Python 3.6 # The original version is saved in .bash_profile.pysave #PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
#export PATH

# Setting PATH for Python 2.7
# The original version is saved in .bash_profile.pysave
#PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}" #export PATH # FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh


# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH

ฉันไม่แน่ใจว่ามันเกี่ยวข้องหรือเกี่ยวข้องกัน แต่เมื่อฉันเปิด python จาก Hotbar และเรียกใช้ ...

>>> print(os.environ['PATH'])

มันพิมพ์

/usr/bin:/bin:/usr/sbin:/sbin

ในขณะที่เมื่อฉันเปิดใช้งานจาก bash terminal โดยใช้IDLE3มันจะส่งกลับ:

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

ข้อมูลอุปกรณ์ต่อพ่วงและการทดลอง:

ฉันคิดว่าฉันอาจจะทำบางอย่างผิดพลาดเมื่อติดตั้ง FSL ทำบางอย่างกับฉัน.bash_profileและตอนนี้ฉันก็ถูกหลอกหลอนในขณะที่พยายามเรียนรู้และพัฒนาทักษะการเขียนโค้ดขั้นพื้นฐาน อาจเป็นข้อผิดพลาดด้วยตนเองหรืออาจเกี่ยวข้องกับ homebrew หรือ Xcode

ฉันสามารถลบ.bash_profileตอนจบได้ แต่ฉันกังวลว่าฉันได้สร้างความเสียหายมามากพอแล้วและไม่ต้องการแก้ไขปัญหาด้วยตัวเองดังนั้นจึงไม่มีฟอรัมอินเทอร์เน็ตที่ลำบากอยากสัมผัสมัน

นี่คือสิ่งที่ควรจะทำงานตามไปมิทช์ Frazier จาก Linux Journal เห็นได้ชัดว่านี่ไม่ใช่ภาพสะท้อนของเขาหรือบทความ แต่เป็นความเข้าใจที่ จำกัด ของฉัน

bash:~ $ export PATH=/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
bash:~ $ echo -n $PATH | awk -v RS=: '!($0 in a) {a[$0]; printf("%s%s", length(a) > 1 ? ":" : "", $0)}'

ผลตอบแทนนี้ ...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profileUser's-MBP:~ username$

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว (แนะนำโดยpepa65 ) ...

bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")

ผลตอบแทนนี้ ...

-bash:  -1: substring expression < 0

เมื่อฉันพยายามมองหาการเปลี่ยนแปลงโดยใช้echo $PATH...

ฉันได้รับบรรทัดว่าง

ฉันรู้ว่าสิ่งนี้ไม่น่าจะกระตุ้นสติปัญญาได้ดังนั้นฉันจึงขอบคุณสำหรับความช่วยเหลือใด ๆ

แก้ไข 1:

ความพยายามที่ไร้เดียงสาที่จะลบออก.bash_profileจากจุดสิ้นสุดของบรรทัดแรกของฉัน.bash_profileไม่ได้ทำให้มันหายไปจากผลลัพธ์echo $PATHที่ยังคงไม่เปลี่ยนแปลง

คำตอบ

tripleee Aug 16 2020 at 14:21

นี่คือการลดและแก้ไข.bash_profileซึ่งเพียงพอสำหรับการกำหนดค่าของคุณ

มีเส้นปัญหาที่จุดเริ่มต้นซึ่ง~/.bash_profileมีการเพิ่มบรรทัดที่ถูกต้องอย่างผิดพลาด อย่างไรก็ตามฉันลบทั้งบรรทัดเนื่องจากฉันคาดหวังและการวินิจฉัยของคุณแนะนำว่ากำลังเพิ่มไดเร็กทอรีซึ่งเป็นค่าเริ่มต้นที่ระบบจัดหาให้PATHแล้ว

ไม่จำเป็นต้องexport PATHมากกว่าหนึ่งครั้งอย่างแน่นอน คุณอาจลบอินสแตนซ์ที่เหลือออกได้อย่างปลอดภัย ความหมายของexportคือการทำเครื่องหมายตัวแปรที่จะทำให้เป็นตัวแปรสภาพแวดล้อมซึ่งสามารถมองเห็นได้สำหรับกระบวนการย่อย เมื่อคุณทำเสร็จแล้วกระบวนการย่อยจะสามารถเข้าถึงค่าปัจจุบันของตัวแปรได้แม้ว่าค่าจะเปลี่ยนไปหลังจากไฟล์export. อาจเป็นไปได้ว่าการกำหนดค่าเชลล์ทั้งระบบของคุณได้ทำสิ่งนี้กับPATHตัวแปรแล้ว (มิฉะนั้นจะไม่สามารถทำงานได้ตามที่ต้องการ)

ฉันลบหัวข้อทั้งหมดที่แสดงความคิดเห็นออกไป แน่นอนว่าคุณอาจต้องการนำพวกเขากลับมาและไม่แสดงความคิดเห็น

# FSL Setup
FSLDIR=/usr/local/fsl
PATH=${FSLDIR}/bin:${PATH}
export FSLDIR PATH
. ${FSLDIR}/etc/fslconf/fsl.sh # Setting PATH for Python 3.8 # The original version is saved in .bash_profile.pysave PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"

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

บางทียังคงตรวจสอบว่า.bash_profile.pysaveมีสิ่งที่เป็นประโยชน์ที่คุณต้องการเก็บไว้หรือไม่แม้ว่าฉันจะคาดหวังว่ามันจะเป็นเช่นนั้นและมีขนาดใหญ่เหมือนกับเวอร์ชันปัจจุบันของคุณยกเว้นบรรทัดสุดท้ายของบรรทัด