$ PATH đang khiến tôi phát điên


10

OK, xin lỗi nếu đây là một cái gì đó ngớ ngẩn, nhưng tôi đang cạn kiệt ý tưởng.

Mục tiêu: thêm vào trước /usr/local/binđể$PATH

Vấn đề: $PATH sẽ không làm những gì tôi muốn hoặc mong đợi

Làm thế nào tôi đến đây: Tôi muốn bắt đầu học lập trình, vì vậy tôi cảm thấy thoải mái khi quậy phá dưới mui xe, nhưng không có nhiều kinh nghiệm. Tôi đã cài đặt fishshell (vì nó thân thiện!) Bằng cách sử dụng homebrewvà đặt nó làm shell mặc định (bên dưới system prefs>users & groups>advanced). Tại một số điểm, tôi chạy brew doctorđến để xem các bản cài đặt của tôi có toàn bộ hay không, và nó đề nghị tôi di chuyển /usr/local/binra phía trước $PATHđể tôi có thể sử dụng bản cài đặt của mình gitthay vì bản sao hệ thống. Tốt thôi - nhưng giữa path_helperfish, một cái gì đó đã xảy ra $PATHngoài tầm kiểm soát của tôi, và tôi không bao giờ có thể sắp xếp các con đường theo đúng cách.

Môi trường: OSX 10.8.2, nâng cấp từ 10.7ish, với xcodevà DevTools cài đặt, cộng x11, homebrewfish

Thông tin thêm: Tôi đã thiết shell mặc định của người dùng của tôi trở lại bash, và cố gắng nhiều vỏ thru terminal.app- bash, fish, sh. Tôi đã chuyển /usr/local/binlên đầu /etc/pathsnhưng nó không thay đổi gì cả. Tôi đã xem qua các config.fishtệp khác nhau và nhận xét những thứ có thể gây rối với $ PATH, không giúp được gì. Tôi có các tập tin sau /etc/paths.d/:

./10-homebrew chứa /usr/local/bin

./20-fish chứa /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz chứa /opt/X11/bin

Tôi nói thêm set +xđể tôi profilevà khi tôi bắt đầu terminal.apptôi nhận được:

Last login: Mon Oct  1 13:31:06 on ttys000
+ '[' -x /usr/libexec/path_helper ']'
+ eval '/usr/libexec/path_helper -s'
++ /usr/libexec/path_helper -s PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/fish/1.23.1/bin:/opt/X11/bin";
export PATH;
+ '[' /bin/bash '!=' no ']'
+ '[' -r /etc/bashrc ']'
+ . /etc/bashrc
++ '[' -z '\s-\v\$ ' ']'
++ PS1='\h:\W \u\$ '
++ shopt -s checkwinsize
++ '[' Apple_Terminal == Apple_Terminal ']'
++ '[' -z '' ']'
++ PROMPT_COMMAND='update_terminal_cwd; '
++ update_terminal_cwd
++ local 'SEARCH= '
++ local REPLACE=%20
++ local PWD_URL=file://Chriss-iMac.local/Users/c4
++ printf '\e]7;%s\a' file://Chriss-iMac.local/Users/c4 
Chriss-iMac:~ c4$

Vì vậy, nó trông giống như path_helper chạy, nhưng sau đó chạy echo $PATHlưới tôi /usr/bin:/bin:/usr/sbin:/sbin. Vì vậy, có vẻ như path_helperthậm chí không làm những gì nó phải làm nữa?

Tôi chắc chắn có một số hành vi được xác định rõ ở đây mà tôi không hiểu, hoặc tôi đã làm hỏng một cái gì đó trong khi cố gắng sửa nó. Xin vui lòng giúp đỡ!


lưu ý, tôi có thể làm cho nó hoạt động fishbằng cách tạo ~/.config/fish/config.fishvới set PATH /usr/local/bin $PATHnhưng tôi vẫn có vấn đề path_helperrõ ràng là không hoạt động như bình thường, và $PATHdo đó không đầy đủ. Cũng vẫn có vấn đề khác nhau $PATHđối với các tập lệnh, ứng dụng bắt đầu từ GUI, v.v.
Chris4d

Câu trả lời:


5

giải pháp:

chọn nếu bạn muốn cài đặt toàn hệ thống hoặc cấu hình người dùng và chỉnh sửa tệp cấu hình phù hợp, không sử dụng path_helper với cá.

hơn

fish không có nguồn / etc / profile, đối với toàn hệ thống và cấu hình người dùng, nó sẽ đọc /etc/fish/config.fish và ~ / .config / fish / config.fish tương ứng [1].

path_helper có nghĩa là để sử dụng cho các shell có nguồn tệp hồ sơ toàn hệ thống (sh, csh và các dẫn xuất của chúng). Vì 10.7 path_helper dường như tôn trọng trật tự trong / etc / path, AFAIR không có trong 10.6 và điều đó khó đối phó hơn.

Nếu bạn thực sự muốn sử dụng path_helper với cá, bạn sẽ cần phân tích đầu ra của nó vì nó sẽ chỉ cung cấp cú pháp sh và csh với các tùy chọn -s-c .

Cái gì đó như

/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g'

nên làm công việc:

[1] http://ridicificentfish.com/shell/user_doc/html/index.html#initialization


Tuyệt quá! Đây là những gì tôi có bây giờ: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- hoạt động tốt ở đây với cá 2 và Mac OS 10.8.3
topskip

3

Tôi hoàn toàn không biết gì về /etc/paths.d, path_helper, & c., Tất cả những điều đó có vẻ như quá phức tạp đối với tôi, nhưng những điều sau đây ở cuối ~ / .bashrc sẽ giúp bạn đúng:

 PATH=/usr/local/bin:$PATH

Hi vọng điêu nay co ich!


Cảm ơn Aaron - path_helperlà một tiện ích dành riêng cho OSX được cho là thiết lập $PATHkhi đăng nhập bằng cách đọc từ /etc/pathsđó /etc/paths.d/*. Dù sao, tôi hiểu đề xuất của bạn nên khắc phục tôi bash, nhưng tôi thực sự muốn nó hoạt động fish(và nhất quán trên toàn hệ thống, nếu điều đó không quá nhiều để mong đợi).
Chris4d

À - xin lỗi về điều đó. Tôi không phải là một người dùng OS X bản thân mình, đáng tiếc hơn, nhưng từ một chút của Google-bashing nó trông như thể này câu hỏi Stack Overflow có thể được nhiều hơn như những gì bạn đang sau - những gì đã nói, một lần nữa, tôi không phải là một Bản thân người dùng OS X và chỉ trả lời vì nhìn nhanh (đọc: bất cẩn) vào câu hỏi của bạn khiến tôi nghĩ rằng bạn chỉ quan tâm đến bash, vì vậy hãy đưa ra lời khuyên của tôi ở đây với một vài hạt muối. Hy vọng nó sẽ giúp, tất cả đều giống nhau -
Aaron Miller

3

Cảm ơn Aaron đã trả lời và cho tất cả những người đã trả lời các câu hỏi tương tự khác trên các trang web stackexchange. Vì lợi ích của hậu thế, đây là những gì tôi đã tìm ra:

  1. path_helperđược gọi từ /etc/profile, theo cú pháp eval '/usr/libexec/path_helper -s'(trong đó dấu nháy đơn thực sự là backticks). Giống như một hình nộm, tôi không biết backticks hoạt động như thế nào và vì vậy đã thay đổi chúng thành dấu ngoặc kép vì một số lý do. Điều này đã phá vỡ tôi profiletừ tải path_helper. Đã thay thế các back-tick và bây giờ nó hoạt động như bình thường (tất nhiên).
  2. sử dụng set PATH /usr/local/bin $PATHtrong tôi ~/.config/fish/profile.fishđảm bảo rằng tôi có được thứ tự đúng trong vỏ ưa thích của mình, nhưng miễn là path_helpernó hoạt động có thể là dư thừa.
  3. Để đảm bảo rằng bản hoàn chỉnh $PATHcó sẵn cho các tập lệnh, ứng dụng GUI, v.v., nó dường như là một sự thay đổi giữa launchd.confenvironment.plist... vẫn đang nghiên cứu cái đó.

1
Tôi mới đọc một ngày khác (nhưng tôi không nhớ lại nguồn) rằng 10.8 không còn cung cấp một cách chắc chắn để có được một đường dẫn hiển thị cho tất cả các ứng dụng. Tôi đặc biệt nhớ rằng môi trường.plist không còn được đọc; Tôi mơ hồ nhận ra launchd.conf, vì vậy nó có thể hoạt động, nhưng tôi nghĩ rằng bài báo đã đề xuất nó sẽ không.
echristopherson

1
theo dõi nhiều hơn: có vẻ như path_helper không hoạt động ở cá; nó xuất ra cú pháp csh hoặc bash, cả hai đều không tương thích. Thay vào đó, bạn có thể sử dụng ~ / .config / fish / config.fish (tập lệnh khởi động cá) để cat /etc/paths.d/* và thêm chúng vào $ PATH. Mong rằng sẽ giúp được ai đó!
Chris4d

bạn đã đọc câu trả lời của tôi chưa? nó đã ở đó từ bốn tháng trước khi bạn theo dõi
anddam
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.