Có phải tmux đã sắp xếp các biến PATH không?


14

Tôi có một vấn đề tái sản xuất:

  1. thiết lập PATH của tôi trong Bash .profile
  2. bắt đầu tmux bởi tmux, tmux attachhoặc bất kỳ biến thể
  3. echo $ PATH và xem nó với cùng các thành phần nhưng theo thứ tự khác nhau

Làm thế nào để ngăn chặn điều này? Điều gì giải thích nó?

Câu trả lời:


29

Nếu bạn đang sử dụng máy Mac và đã tự hỏi tại sao cứ /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bintiếp tục sử dụng PATH khi bạn chạy tmux, thì đó là vì một tiện ích có tên path_helper chạy từ /etc/profiletệp của bạn .

Bạn không thể dễ dàng thuyết phục tmux (hay đúng hơn là bash) không nguồn /etc/profile(vì một số lý do tmux luôn chạy như một vỏ đăng nhập, có nghĩa là / etc / profile sẽ được đọc), nhưng bạn có thể chắc chắn rằng các hiệu ứng của path_rcper don vít với PATH của bạn.

Mẹo nhỏ là đảm bảo rằng PATH trống trước khi path_helper chạy. Trong ~/.bash_profiletập tin của tôi, tôi có cái này:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

Xóa PATH trước khi thực thi path_helper sẽ ngăn không cho nó trả trước PATH mặc định cho PATH đã chọn (trước đó) của bạn và sẽ cho phép phần còn lại của các tập lệnh thiết lập bash cá nhân của bạn (tiếp tục xuống .bash_profilehoặc .bashrcnếu bạn đã lấy nó từ .bash_profile) để thiết lập ĐÚNG cho phù hợp.

Hy vọng điều đó có ý nghĩa ...


1
Điều này hoàn toàn làm điều đó cho tôi! Tôi có nó ẩn đằng sau một if [ -n "$TMUX" ]điều khoản bản thân mình, nhưng tôi đã tự hỏi - [ -f /etc/profile ]thực sự quan trọng như thế nào ? Có an toàn không khi cho rằng đó /etc/profileluôn là một tệp thông thường?
Ryan Lue

1
@RyanLue Bạn có thể thoải mái thay thế -fbằng -e, nhưng cá nhân tôi sẽ không thử và lấy một tệp từ một tập lệnh được chạy khi tôi đăng nhập trừ khi tôi đã kiểm tra nó ở đó. Mặc dù vậy, tôi có xu hướng sử dụng lại tập lệnh bash của mình trên nhiều máy khác nhau (và hệ điều hành), vì vậy tôi muốn đảm bảo rằng chúng là bằng chứng đạn. Tôi có thể tưởng tượng một số biến thể unix khác có thể gọi nó là cái gì đó khác.
Graham Ashton

CẢM ƠN BẠN! Điều này khiến tôi phát điên, và đặt đoạn trích nhỏ đó lên đỉnh của ~/.bash_profilesự tỉnh táo đã mang tôi trở lại thế giới tmux hạnh phúc của tôi.
hoosierEE

Nếu bạn không muốn gây rối với giá trị mặc định của hệ thống, set -g default-command "${SHELL}"trong .tmux.conflực lượng tmux sử dụng vỏ không đăng nhập. Dù sao thì tôi cũng không thấy điểm nào vì bạn thường mở tmux sau khi bạn đã đăng nhập.
seeker_of_bacon

5

Không; sắp xếp $PATHsẽ là một điều quá điên rồ để làm, vì nhiều hệ thống phụ thuộc vào thứ tự do người dùng đặt.

Tuy nhiên, tmux không khởi động trình bao của bạn ở chế độ "đăng nhập", khiến ~/.profilenguồn gốc lại xuất hiện . Điều này có nghĩa là nếu bạn có một cái gì đó giống như PATH=/my/dir:/another/dir:$PATHtrong tệp đó , nó sẽ được thực hiện lại , dẫn đến có chứa $ PATH /my/dir:/another/dir:/my/dir:/another/dir:(etc.). Để tránh điều này, bạn có thể sử dụng một biến khác để kiểm tra:

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"

0

@Graham Ashton Cảm ơn ý tưởng của bạn

Đề nghị của tôi sẽ là bạn đặt

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

tại tệp .zshrc của bạn ở đầu tệp.

ĐẢM BẢO rằng

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

dưới đây

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.