Câu trả lời:
.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 ~/.profile
nếu nó được gọi là sh
hoặ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/sh
vỏ đăng nhập của bạn và bao gồm export SHELL=/bin/zsh
trong 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 $SHELL
cài đặt). Nhưng bạn vẫn sẽ có sh
khi 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ó sshd
hoặ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 ~/.profile
là tạo một ~/.zprofile
chế độ 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 chsh
lệ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_profile
nếu nó tồn tại và ~/.profile
trong 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, ~/.profile
cũ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 ~/.zshrc
trong 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 ~/.bashrc
trong shell đăng nhập.)
Thông thường, ~/.profile
chứ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; ~/.zshrc
chứ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.
~/.profile
không được tải bởi zsh
lúc đăng nhập.zsh
tải ~/.zprofile
lúc đăng nhập.zsh
tải ~/.zshrc
khi 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!
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 đã .zprofile
tương thích với .profile
(chỉ chứa các thay đổi PATH), do đó chỉ cần:
ln -s .profile .zprofile
Các zsh tài liệu tôi có trong tay chỉ đề cập đến /etc/profile
và ~/.profile
cho 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
( ~/.zprofile
mặ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...