Thay đổi shell mặc định mà không có đặc quyền chsh hoặc quản trị viên


8

Tôi đã thấy đoạn mã sau trong chuỗi này: Cách thay đổi từ csh sang bash làm shell mặc định

sleep 2
if (-x /usr/local/bin/bash) then
  exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

Hiểu biết của tôi là nếu bạn đặt đoạn mã này vào ~/.loginnó sẽ gọi bashkhi bạn đăng nhập.

Tôi có một tình huống tương tự khi tôi muốn sử dụng một đoạn tương tự để gọi một phiên bản khác với phiên bản zshmặc định mà tôi đăng nhập. Một phần lý do tại sao tôi gặp phải sự cố này là vì tôi không thể chọn phiên bản mong muốn của tôi zshtrong các tùy chọn được phép chshvà tôi không có quyền quản trị viên.

Với cái này:

  • Làm cách nào để thay đổi đoạn mã trên để thực hiện việc này khi chuyển đổi giữa các phiên bản khác nhau của zsh?
  • Tại sao hai execlệnh cần thiết trong đoạn trích ở trên? Họ làm gì? Ngoài ra, tại sao đoạn mã trên sử dụng sh bash (người dùng có nghĩa vụ phải đăng nhập csh)

Câu trả lời:


6

Nếu bạn muốn thực thi zsh thay vì bash, chỉ cần thay thế /usr/local/bin/bashbằng đường dẫn đến zshtệp thực thi. Lưu ý rằng đoạn mã này là dành riêng cho csh; nếu shell đăng nhập của bạn không phải là (t) csh, mã này ~/.loginsẽ không làm gì cho bạn.

Về lý do tại sao đoạn trích được viết theo cách đó, bạn phải hỏi người viết nó. [Kiểm tra xem đó là ai.] Ồ. Chà, nếu bạn chỉ làm vậy exec /usr/local/bin/bashthì bạn sẽ không bắt đầu một shell đăng nhập, vì vậy bạn .profilesẽ không được thực thi. Nhưng điều này có thể được giải quyết theo cách đơn giản hơn bằng cách thực thi /usr/local/bin/bash --login.

Bây giờ, nếu vỏ đăng nhập của bạn không phải là csh, bạn sẽ muốn có một đoạn khác exec. Trong shell kiểu Bourne, bao gồm zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

Làm điều đó exec ~/bin/zsh -lnếu bạn muốn phiên bản mới của zsh đọc của bạn ~/.zprofile. Lưu ý rằng nếu bạn làm điều đó, đoạn trích ở trên phải nằm trong .profilehoặc .bash_profile; nếu vỏ đăng nhập của bạn là zsh, đừng đặt đoạn mã vào của bạn .zprofile, nếu không, hãy chắc chắn rằng phiên bản mới của zsh sẽ không gọi execlại như vậy.


Cảm ơn @Gilles. Tôi đã viết như sau .zprofile: if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fivà điều đó dường như có hiệu quả!
Amelio Vazquez-Reina
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.