Chia sẻ bí danh và cài đặt PATH giữa zsh và bash


24

Vỏ mà tôi thường sử dụng là zsh. Tôi có một số bí danh để kích hoạt màu sắc trong một số chương trình như lsgrep. Tôi cũng đã đặt đường dẫn tùy chỉnh của mình để tôi có thể thực hiện các chương trình ở vị trí không chuẩn (chẳng hạn như trong ~/bin/).

Tôi sẽ không thay đổi shell của root thành zsh, nhưng tôi muốn chia sẻ các cài đặt này để root cũng có thể có nó. Tôi phát hiện ra rằng đó zshkhông phải là tìm nguồn cung ứng /etc/profile. Tôi có thể tìm nguồn này /etc/zsh/zprofile, nhưng tôi muốn một số cách "phù hợp" khác.

Câu trả lời:


16

Tôi sẽ tạo một tập tin /etc/commonprofilevà nguồn nó trong cả hai /etc/profile/etc/zsh/zprofile. Điều này sẽ cho bạn cơ hội để chia sẻ các thiết lập chung và vẫn sử dụng bashtương ứng zshcác thiết lập và cú pháp cụ thể trong /etc/profiletương ứng zprofile.


trong số những câu trả lời hay khác tôi nghĩ rằng câu trả lời này phù hợp với tôi nhất, tương đối đơn giản và "sạch sẽ"
phunehehe

bạn có ý nghĩa gì bởi "nguồn nó"?
Hlung

@Hlung Để tải tính năng khám phá cấu hình shell, ở đây 'nguồn /path/to/.shell_profile' xuất hiện. Xem trang người đàn ông trên 'nguồn'.
Itachi

17

Zsh có chế độ tương thích sh sẽ cho phép nó thực thi mã sh POSIX và một số tiện ích mở rộng bash. Miễn là bạn không sử dụng các tính năng bash mà zsh không có (với cùng một cú pháp), bạn có thể có cùng một tệp có nguồn gốc từ cả hai shell. Sử dụng tích emulatehợp để đặt zsh trong chế độ tương thích; với -Ltùy chọn, mô phỏng là cục bộ của hàm kèm theo (không phải là tập lệnh có nguồn gốc kèm theo).

source_sh () {
  emulate -LR sh
  . "$@"
}

Đối với những thứ như biến môi trường, bạn có thể sử dụng source_sh /etc/profiletrong /etc/zprofilesource_sh ~/.profiletrong ~/.zprofile, vì các tệp hồ sơ không có khả năng sử dụng các tính năng cụ thể của bash.

Đối với những thứ như bí danh và định nghĩa hàm, vì các tệp RC shell có thể chứa rất nhiều thứ không thể chia sẻ (nhắc nhở, ràng buộc chính, cài đặt hoàn thành, vá), hãy sử dụng một tệp như ~/.sh_aliasesvậy có nguồn gốc ~/.bashrcsource_sh'd trong ~/.zshrc.


2
Cần có một cách để nói "tự động nâng cao tất cả các câu trả lời của Gilles". Điều này sẽ giúp tôi tiết kiệm khá nhiều thời gian. Không thực sự, câu trả lời của bạn rock. Luôn chính xác, được viết tốt và toàn diện.
fschmitt

@fschmitt: Tôi đồng ý. Và bạn có thể thấy nó thậm chí không được chỉnh sửa! Gợi ý này được cung cấp ở đây là thực sự tốt.
Ai đó vẫn sử dụng bạn MS-DOS

4

Một symlink đơn giản thì sao?

ln -s /etc/profile /etc/zsh/zprofile

Bạn cũng có thể nối thêm một cái gì đó như thế này nếu bạn cần một số khởi tạo có điều kiện:

#Determine our shell without using $SHELL, which may lie
shell="sh"
if test -f /proc/mounts; then
   case $(/bin/ls -l /proc/$$/exe) in
        *bash) shell=bash ;;
        *dash) shell=dash ;;
        *ash)  shell=ash ;;
        *ksh)  shell=ksh ;;
        *zsh)  shell=zsh ;;
    esac
fi

Hmm nhưng tôi không nghĩ rằng điều này sẽ sạch hơn bất kỳ nguồn nào. Có một tập tin mà cả zsh và bash sẽ đọc?
phunehehe

Điều gì khiến bạn nghĩ rằng tìm nguồn cung ứng hoặc tạo một liên kết tượng trưng không phải là một giải pháp "sạch"?
echox

Tôi chỉ muốn nói nếu cần, tôi muốn tìm nguồn tệp hơn là quản lý symlink. Tôi không muốn tạo ra nhiều sự phụ thuộc giữa các tập tin.
phunehehe

1
Một thay thế di động hơn /bin/ls -l /proc/$$/exeps -o comm= -p $$. Điều này không hoàn toàn đáng tin cậy vì một số vỏ hoạt động khác nhau tùy thuộc vào cách chúng được gọi; trong thực tế chỉ đơn giản là thử nghiệm $0trong .profilecó khả năng là một dấu hiệu tốt hơn. Nhưng hầu hết vỏ cung cấp tính năng hữu ích (bash, ksh, zsh) có thể được chỉ đơn giản là được công nhận (và phiên bản của họ được xác định, đó là một lợi thế lớn) bằng cách kiểm tra một số biến: $BASH, $BASH_VERSION, $BASH_VERSINFO; $KSH_VERSION, ${.sh.version}; $ZSH_VERSION.
Gilles 'SO- ngừng trở nên xấu xa'

echox, tuyên bố trường hợp của bạn không phát hiện chính xác zsh4 #Determine shell của chúng tôi mà không sử dụng $ SHELL, có thể nằm shell = "sh" nếu test -f / Proc / mounts; sau đó trường hợp $ (/ bin / ls -l / Proc / $$ / exe) trong bash) shell = bash ;; * dấu gạch ngang) shell = dấu gạch ngang ;; * tro) vỏ = tro ;; * ksh) vỏ = ksh ;; * zsh ) vỏ = zsh ;; #matches zsh4 esac fi
Bryan Hunt

0

Liên quan đến các biến, tôi có ấn tượng rằng bạn đang thiếu các mô-đun & mô-đun [1]. Khi bạn bắt đầu làm như vậy, sẽ dễ dàng tạo các cấu hình chung cho các shell khác nhau (bao gồm bash & zsh), python, perl và thậm chí nhiều môi trường hơn, tất cả đều từ sự tiện lợi của một tệp mô-đun.

Cũng có thể định nghĩa các bí danh theo cùng một cách; tuy nhiên, bạn sẽ nhanh chóng thấy rằng các bí danh không được kế thừa rất tốt giữa các lớp vỏ liên tiếp và có thể cần cách giải quyết.

[1] http://en.wikipedia.org/wiki/En Môi_Modules_ (software)

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.