Sự khác biệt giữa $ path và $ PATH (chữ thường so với chữ hoa) với zsh là gì?


12

Trong FreeBSD 12, sử dụng zshshell, tôi nhận thấy sự khác biệt này khi nhìn vào $path(chữ thường) so với $PATH(chữ hoa).

echo $path

/ sbin / bin / usr / sbin / usr / bin / usr / local / sbin / usr / local / bin / usr / home / freebsd / bin

echo $PATH

/ sbin: / bin: / usr / sbin: / usr / bin: / usr / local / sbin: / usr / local / bin: / usr / home / freebsd / bin

Một đầu ra được phân định bằng ký tự SPACE, đầu ra còn lại bằng ký tự COLON.

Tại sao lại có sự khác biệt?

Là hai biến khác nhau, riêng biệt? Hoặc chữ thường / chữ hoa kích hoạt một số loại mẹo hoặc ý nghĩa mà tôi không biết về?

Đây có phải là một zshtính năng? Hay một tính năng của FreeBSD?


1
Ngoài ra: Trong bất kỳ hệ vỏ tương thích POSIX nào, tên biến có bất kỳ ký tự chữ thường nào đều được đảm bảo an toàn cho sử dụng ứng dụng (không âm thầm sửa đổi vỏ hoặc hành vi hệ thống khi thay đổi). Đây là một trong những nơi mà quyết định của zsh chỉ tuân theo tiêu chuẩn mà theo đó có ý nghĩa đối với họ có thể gây đau đầu cho các tác giả kịch bản, bởi vì các đảm bảo được tiêu chuẩn hóa không áp dụng.
Charles Duffy

@CharlesDuffy bạn có một liên kết đến một phần của tiêu chuẩn mà nó nói bất kỳ điều nào về các biến viết thường và viết hoa không? Cảm ơn.
mosvy

@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/... - đọc nó giữ trong tâm trí rằng các biến vỏ và môi trường chia sẻ một không gian tên duy nhất (thiết lập một biến vỏ cập nhật các giá trị của bất kỳ biến môi trường hiện tại như tên; thiết lập một biến môi trường khởi tạo các biến shell). Các dòng cụ thể: Không gian tên của các tên biến môi trường chứa các chữ cái viết thường được dành riêng cho các ứng dụng. Các ứng dụng có thể định nghĩa bất kỳ biến môi trường nào có tên từ không gian tên này mà không sửa đổi hành vi của các tiện ích tiêu chuẩn.
Charles Duffy

@CharlesDuffy Điều đó không áp dụng ở đây. Cài đặt pathbên trong zshsẽ không cập nhật bất kỳ pathenvvar : path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy

@mosvy, bạn đã thuyết phục tôi rằng nó không vi phạm tiêu chuẩn. Các tinh thần , mặt khác, sẽ làm for path in "$dir"/*theo phản xạ an toàn-to-ghi mã.
Charles Duffy

Câu trả lời:


19

Đó là một tính năng zshđược kế thừa từ csh/ tcsh.

Biến $path mảng được gắn với biến $PATH vô hướng (chuỗi). Bất kỳ sửa đổi trên một được phản ánh trong cái khác.

Trong zsh(trái với (t)csh), bạn có thể buộc các biến khác bên cạnh $PATHvới typeset -T. Đó là thông thường, nhưng không bắt buộc, để sử dụng tên viết hoa cho vô hướng được phân tách bằng dấu hai chấm và cùng tên trong chữ thường cho mảng. Trong khi dấu hai chấm là dấu phân cách mặc định, các dấu phân cách khác có thể được sử dụng (ví dụ: dòng mới để buộc một chuỗi nhiều dòng vào một mảng hoặc dấu phẩy để buộc một hàng csv thành một mảng)

Trong các phiên bản gần đây của zsh, typeset -p PATHhoặc typeset -p pathhiển thị liên kết giữa hai biến:

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )

Điều đó hữu ích ở chỗ nó giúp dễ dàng thêm các thành phần loại bỏ hoặc lặp qua chúng.

Làm một typeset -U pathđể làm cho các phần tử duy nhất cũng giúp giữ cho $PATHbiến sạch (một cái gì đó tương tự có thể đạt được tcshvới set -f).

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.