Hàm được xác định trong .bashrc của người dùng của tôi gây ra lỗi khi tôi sudo su


3

Tôi có một hàm được định nghĩa trong tệp .bashrc của người dùng hiển thị tên nhánh git hiện tại của tôi tại dấu nhắc lệnh của tôi:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
PS1="\\[$(tput setaf 7)\\]\\w \$(parse_git_branch)> \\[$(tput sgr0)\\]"

Khi tôi sudo để su, có vẻ như PS1 của tôi được chuyển qua và sau mỗi lệnh tôi nhận được lỗi bash: parse_git_branch: command not found.

Tôi có thể thay đổi điều gì để khi tôi sudo cho người dùng khác, PS1 của nó được sử dụng chứ không phải của người dùng của tôi?

Chỉnh sửa: Có vẻ như điều này chỉ xảy ra sau khi tôi sử dụng nguồn virtualenv của Python. Nếu tôi sudo su trước khi tôi nguồn virtualenv, lỗi này không xảy ra.


có lẽ việc chuyển fashuon dưới dạng bashrc sang .profile có thể giải quyết vấn đề - hãy thử.
mnmnc

@mnmnc .profilechỉ được đọc bởi shell đăng nhập.
terdon

lỗi gì bạn nhận được? Nó dường như không gây ra vấn đề gì trên hệ thống của tôi. sudo sucó PS1 bình thường.
terdon

@terdon Tôi không nhận được bất kỳ lỗi nào ngoài "lệnh không tìm thấy" khi tôi sudo su.
skyler

Trên thực tế có vẻ như điều này chỉ xảy ra sau khi tôi sử dụng nguồn virtualenv Python. Nếu tôi sudo su trước khi tôi nguồn virtualenv, lỗi này không xảy ra.
skyler

Câu trả lời:


3

Bạn đã bao giờ expor PS1ở đâu đó (ví dụ như trong virtualenv Python của bạn ) chưa? Tôi luôn có dòng này trong .bashrchoặc .bash_profile:

export -n PS1 # unexport PS1 so sub-processes will not inherit it

Vì vậy, hãy thử export -n PS1trước khi bạn sudo.


6

PS1không được thiết lập lại bởi sudo, nó được giữ theo mặc định. Các chức năng là một phần của môi trường bash, nhưng không được bảo tồn bởi sudo. Bạn có thể làm bất cứ điều gì trong một số điều:

  • thay vì sử dụng sudo su -để bạn có được một vỏ đăng nhập, nó sẽ thiết lập lạiPS1
  • thiết lập env_resetđể "làm sạch" môi trường, có thể vớienv_keep
  • đặt SUDO_PS1và sudo sẽ đặt giá trị đó vàoPS1
  • sử dụng sudo -itương tự su -(bạn sẽ cần thêm vỏ của mình vào sudoerstệp)
  • kiểm tra biến SUDO_COMMANDtrong .bashrcvà đặt lạiPS1

Danh sách các biến sudogiữ (có thể thay đổi theo phiên bản, kiểm tra env.ctrong nguồn) bao gồm:

DISPLAY COLORS LS_COLORS HOSTNAME PS1 PS2 TZ

Đây là một danh sách được mã hóa cứng, nó không giống với env_keep(ví dụ " env_keep -=" sẽ không thay đổi nó).

Chạy sudo -Vvới quyền root cho danh sách đầy đủ các biến được bảo tồn hoặc xóa (đối với sudophiên bản> = v1.7).

Một đề nghị cuối cùng, bạn có thể làm cho PS1mạnh mẽ hơn bằng cách kiểm tra xem hàm có tồn tại không:

PS1="\\[$(tput setaf 7)\\]\\w \$(type -t parse_git_branch >/dev/null && parse_git_branch)> \\[$(tput sgr0)\\]"

1
Thông thường một var env sẽ không được truyền cho các tiến trình con trừ khi var được xuất. Vì vậy, nếu PS1không được xuất khẩu sudosẽ không nhìn thấy hoặc giữ nó.
pynexj

Có bạn hoàn toàn chính xác, thông thường nó muốn (vì vậy bạn không cần sửa nó trong các lớp con), nhưng bạn cũng có thể export -n PS1để nó không được xuất.
mr.spuratic
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.