Đường dẫn trùng lặp, Sự cố với .bash_profile
Tôi đã được hướng dẫn đến đây từ Stack Overflow sau khi đăng câu hỏi về việc đấu tranh để PyExifTool hoạt động. Tuy nhiên, có vẻ như vấn đề còn nhiều mặt và là một người mới làm quen, tôi được yêu cầu tìm kiếm sự giúp đỡ ở đây.
Về cơ bản, vấn đề đã được nhận ra khi tôi được yêu cầu chạy ...
bash:~ $ type -all exiftool
mà đã trả lại ...
exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool
... tiết lộ rằng ở đâu đó tôi đã có bản sao.
Sau đó, tôi chạy ...
bash:~ $ echo $PATH
Mà đã trả lại ...
/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
... chứa các bản sao và dường như không được kết thúc bằng .bash_profile
Bây giờ trong thiết bị đầu cuối, tôi có thể làm sạch điều này bằng cách sử dụng ...
bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')
Trên đây là một đoạn mã mà tôi nhận được từ Tạp chí Linux được cho là 'gần như hoạt động' nhưng đoạn mã 'nên hoạt động' dường như không giúp được tôi. Sử dụng mã 'gần như chức năng' sẽ cho kết quả sau:
/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 :
Tôi là một người mới hoàn toàn nhưng tôi không nghĩ rằng nó phải kết thúc :
và rõ ràng .bash_profile
là vẫn còn. Tuy nhiên, nó dường như loại bỏ các bản sao, mặc dù điều này sẽ đặt lại nếu tôi mở một cửa sổ đầu cuối mới, vì vậy đây chỉ là một cách giải quyết khẩn cấp.
Đây là hồ sơ bash của tôi trông như thế nào:
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
Tôi không chắc điều này có liên quan hay liên quan không nhưng khi tôi khởi chạy python từ Hotbar của mình và chạy ...
>>> print(os.environ['PATH'])
Nó in
/usr/bin:/bin:/usr/sbin:/sbin
Trong khi khi tôi khởi chạy nó từ thiết bị đầu cuối bash của mình bằng cách sử dụng IDLE3
nó trả về:
/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
Thông tin ngoại vi & Thử nghiệm:
Tôi nghĩ có lẽ tôi đã làm sai điều gì đó khi cài đặt FSL, đã làm gì đó với tôi .bash_profile
và hiện đang bị ám ảnh trong khi cố gắng học và phát triển các kỹ năng viết mã cơ bản. Có thể đó là một lỗi thủ công hoặc có lẽ nó liên quan đến homebrew hoặc Xcode.
Tôi có thể xóa phần .bash_profile
kết nhưng tôi lo lắng rằng tôi đã gây ra đủ thiệt hại và không muốn tự mình gỡ rối thành một vấn đề quá tốn công sức mà không diễn đàn internet nào muốn chạm vào nó.
Đây là những gì được cho là hoạt động theo Mitch Frazier từ Tạp chí Linux . Rõ ràng đây không phải là sự phản ánh về anh ta hay bài báo mà là sự hiểu biết hạn chế của tôi.
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)}'
Điều này trả về ...
/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$
Tôi cũng đã thử cách sau (do pepa65 đề xuất ) ...
bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")
Điều này trả về ...
-bash: -1: substring expression < 0
Khi tôi cố gắng tìm kiếm các thay đổi bằng echo $PATH
...
Tôi nhận được một dòng trống.
Tôi biết điều này khó có thể kích thích trí tuệ nên tôi rất biết ơn sự giúp đỡ.
CHỈNH SỬA 1:
Một nỗ lực ngây thơ để xóa .bash_profile
khỏi cuối dòng đầu tiên của tôi .bash_profile
đã không làm cho nó biến mất khỏi đầu ra echo $PATH
vẫn không thay đổi.
Trả lời
Đây là bản thu gọn và sửa chữa .bash_profile
phù hợp với cấu hình của bạn.
Có một dòng có vấn đề ở phần đầu ~/.bash_profile
đã được thêm sai vào một dòng đúng khác. Tuy nhiên, tôi đã xóa toàn bộ dòng, vì tôi mong đợi và chẩn đoán của bạn cho thấy rằng nó đang thêm một thư mục đã có ở mặc định do hệ thống cung cấp PATH
.
Chắc chắn không cần export PATH
nhiều hơn một lần; có lẽ bạn có thể loại bỏ một cách an toàn ngay cả một phiên bản còn lại. Ý nghĩa của export
là đánh dấu một biến được tạo thành một biến môi trường mà các quy trình con có thể nhìn thấy được. Khi bạn đã làm điều đó, các quy trình con sẽ có quyền truy cập vào giá trị hiện tại của biến, ngay cả khi giá trị thay đổi sau export
. Rất có thể cấu hình shell toàn hệ thống của bạn đã thực hiện điều này cho PATH
biến (nếu không thì nó không thể hoạt động như dự định).
Tôi đã xóa toàn bộ phần đã được bình luận; tất nhiên bạn có thể muốn đưa chúng trở lại và bỏ ghi chú.
# 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}"
Tệp này được đọc khi bạn khởi động trình bao mới, mặc dù thời điểm chính xác cũng sẽ phụ thuộc vào cách nhà cung cấp hệ điều hành của bạn đã cấu hình Bash. Để hoàn toàn chắc chắn rằng bất kỳ cấu hình cũ nào không còn can thiệp vào cấu hình hiện tại của bạn, bạn sẽ phải tìm hiểu xem liệu có cần đăng xuất và đăng nhập lại để bắt đầu lại hay không, hoặc bạn có thể bắt đầu một trình bao mới hoặc một phiên đầu cuối mới để có được một phương tiện sạch sẽ.
Có lẽ vẫn nên xem lại xem .bash_profile.pysave
có chứa thứ gì đó hữu ích mà bạn muốn giữ lại hay không, mặc dù tôi mong rằng nó sẽ giống với phiên bản hiện tại của bạn, ngoại trừ tập hợp các dòng cuối cùng.