Zsh không nhấn ~ / .profile


145

Tôi vừa cài đặt zsh trên hệ thống Ubuntu của mình. Có vẻ như zsh không thực thi ~ / .profile trên init. Theo hiểu biết tốt nhất của tôi, đây nên là một hành vi tự động. Tôi đang thiếu gì?

Câu trả lời:


204

.profile so với .zprofile

Zsh chạy ~/.zprofile, không ~/.profile, khi nó được gọi như một vỏ đăng nhập. Lý do là zsh có đủ sự không tương thích với các shell tiêu chuẩn để phá vỡ các tập lệnh.

Zsh không chạy ~/.profilenếu nó được gọi là shhoặc ksh. Nhưng nếu mục tiêu của bạn là nhận được lời nhắc zsh khi bạn đăng nhập, điều đó không có ích.

Bạn có thể tạo /bin/shvỏ đăng nhập của bạn và bao gồm export SHELL=/bin/zshtrong của bạn ~/.profile. Sau đó, khi bạn mở một thiết bị đầu cuối, thiết bị đầu cuối sẽ khởi chạy zsh (ngoại trừ một vài trình giả lập thiết bị đầu cuối không tuân theo $SHELLcài đặt). Nhưng bạn vẫn sẽ có shkhi bạn đăng nhập qua ssh. Điều này có thể được khắc phục bằng cách bao gồm exec zshở cuối ~/.profile(điều này thay thế shell đang chạy bằng zsh), nhưng bạn chỉ cần cẩn thận để làm điều đó cho đăng nhập tương tác chứ không phải khi ~/.profileđược bao gồm từ các tập lệnh khác như bắt đầu phiên X (tốt kiểm tra là tên của quá trình cha mẹ thu được bằng cách ps -o comm= $PPID: nếu nó sshdhoặc su, thì nó an toàn exec).

Giải pháp đơn giản nhất để cả hai hoạt động với zsh và run ~/.profilelà tạo một ~/.zprofilechế độ vào chế độ mô phỏng sh trong khi nó chạy ~/.profile:

emulate sh
. ~/.profile
emulate zsh

Nếu bạn có một zsh đủ gần đây (trên Ubuntu, điều đó có nghĩa là từ sáng suốt, tôi nghĩ vậy), bạn có thể đơn giản hóa việc này thành emulate sh -c '. ~/.profile'.

.zprofile so với .zshrc

Các tập tin ~/.profileđược tải bởi shell đăng nhập . Shell đăng nhập là quá trình đầu tiên được bắt đầu khi bạn đăng nhập ở chế độ văn bản, ví dụ như trên bảng điều khiển văn bản hoặc qua ssh. Theo mặc định, trên hầu hết các máy Linux, shell đăng nhập là bash, nhưng bạn có thể thay đổi nó bằng chshlệnh hoặc thông qua một số công cụ khác, chẳng hạn như Cài đặt người dùng trên máy tính trong Ubuntu. Khi đó là vỏ đăng nhập, bash sẽ đọc ~/.bash_profilenếu nó tồn tại và ~/.profiletrong khi zsh chỉ đọc ~/.zprofile(vì cú pháp của nó không hoàn toàn tương thích với một sh ​​truyền thống). Trong hầu hết các cấu hình, ~/.profilecũng được tải bởi các tập lệnh khởi động phiên X khi bạn đăng nhập vào trình quản lý hiển thị đồ họa.

Khi bạn khởi động trình giả lập thiết bị đầu cuối và nhận được dấu nhắc trình bao hoặc khi bạn khởi động trình bao rõ ràng, bạn sẽ nhận được một trình bao không phải là trình bao đăng nhập. Vì ~/.profile(hoặc ~/.zprofile) dành cho các lệnh mà bạn muốn thực thi khi đăng nhập, nên trình bao không đăng nhập sẽ không đọc tệp này. Thay vào đó, khi bạn bắt đầu một zsh tương tác, nó sẽ đọc ~/.zshrc. (Zsh đọc ~/.zshrctrong tất cả các shell tương tác, cho dù chúng không phải là shell đăng nhập; bash, lạ thay, không bao giờ đọc ~/.bashrctrong shell đăng nhập.)

Thông thường, ~/.profilechứa các định nghĩa biến môi trường và có thể bắt đầu một số chương trình mà bạn muốn chạy một lần khi bạn đăng nhập hoặc cho toàn bộ phiên; ~/.zshrcchứa những thứ phải được thực hiện cho mọi phiên bản shell, chẳng hạn như bí danh và định nghĩa hàm, cài đặt tùy chọn shell, cài đặt hoàn thành, cài đặt nhắc nhở, ràng buộc khóa, v.v.


Câu trả lời chính xác! Tôi đã tạo ~ / .zprofile và đặt dòng như bạn đề xuất, nhưng dường như nó không làm gì cả. Có lẽ tôi nên đặt nó trong .zshrc?
shmichael

1
@shmichael: Đưa ra phản ứng của bạn, tôi có thể không diễn giải câu hỏi của bạn theo cách bạn dự định. Phần thứ hai tôi đã thêm vào câu trả lời của tôi có giúp được không?
Gilles

vâng, đánh vào chỗ Vì vậy, nếu tôi hiểu chính xác, tôi sẽ muốn ví dụ khai báo PATH trên .zprofile và bí danh trên .zshrc.
shmichael

@ user1419674 Cảm ơn bạn đã sửa, nhưng không thêm nhật ký thay đổi vào bài viết. Trang web có một lịch sử sửa đổi tích hợp.
Gilles

69

Câu trả lời ngắn gọn cho những người thiếu kiên nhẫn:

  1. ~/.profilekhông được tải bởi zshlúc đăng nhập.
  2. zshtải ~/.zprofilelúc đăng nhập.
  3. zshtải ~/.zshrckhi bắt đầu một phiên cuối mới.

Cần thêm thông tin? Nhìn vào câu trả lời tuyệt vời của Gilles!


Câu trả lời chính xác. Chỉ cần những gì bạn cần.
Django Reinhardt

21

Ngoài câu trả lời của Gilles, với phiên bản zsh hợp lý gần đây, bạn có thể làm điều này:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... Sẽ cung cấp tệp .profile với chế độ sh của zsh có hiệu lực. Và nó chỉ hoạt động trong nguồn. Vì vậy, bạn không phải lưu trạng thái tùy chọn hiện tại để phát lại nó sau khi tìm nguồn cung ứng.


Tôi có cái này trong ~ / .zprofile của tôi, nhưng vì một số lý do, các câu lệnh trong ~ / .profile không có sẵn trong vỏ của tôi. Ubuntu 15.04; zsh 5.0.7
Friederbluemle

Khó chẩn đoán mà không có mã.
Frank Terbeck

Tôi vừa thử lại, và có vẻ như nó đang hoạt động. Không chắc chắn nếu nó đã được sửa chữa tại một số điểm hoặc những gì đã xảy ra. phiên bản zsh là 5.1.1.
Friederbluemle 28/03/2016

5

Tôi đã .zprofiletương thích với .profile(chỉ chứa các thay đổi PATH), do đó chỉ cần:

ln -s .profile .zprofile

0

Các zsh tài liệu tôi có trong tay chỉ đề cập đến /etc/profile~/.profilecho vỏ đăng nhập trong sh / ksh chế độ tương thích.

% zsh --version
zsh 4.3.10 
% cat ~/.profile
echo 'Running ~/.profile...'

Shell đăng nhập chế độ gốc (argv [0] bắt đầu bằng -) không sử dụng ~/.profile( ~/.zprofilemặc dù nó sẽ sử dụng ):

% zsh -c 'exec -a -zsh zsh' </dev/null

(không có đầu ra)

sh / ksh tương thích vỏ chế độ đăng nhập sử dụng .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
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.