Sử dụng ^ như một metacharacter vỏ


19

Tôi đã viết một kịch bản nhỏ ngày hôm nay có chứa

grep -q ^local0 /etc/syslog.conf

Trong quá trình xem xét, một đồng nghiệp đề nghị ^local0được trích dẫn vì ^có nghĩa là "đường ống" trong vỏ Bourne. Ngạc nhiên trước tuyên bố này, tôi đã cố gắng theo dõi bất kỳ tài liệu tham khảo nào đề cập đến điều này. Không có gì tôi tìm thấy trên internet cho thấy đây là một vấn đề.

Tuy nhiên, hóa ra việc triển khai bsh(tự xưng là vỏ Bourne) trên AIX 7 thực sự có hành vi này:

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

Không có cách triển khai "vỏ Bourne" nào khác mà tôi đã thử hành xử theo cách này (nghĩa ^là hoàn toàn không được coi là một siêu vi khuẩn vỏ). Tôi đã thử shtrên CentOS (thực sự là bash) và shtrên FreeBSD (không phải là bash). Tôi không có nhiều hệ thống khác để thử.

Là hành vi này được mong đợi? Những vỏ nào được coi ^là một metacharacter ống?


1
Tôi biết đó ^là một nhân vật phủ định trong zsh và cả trong không gian regex. Là một nhận xét riêng biệt, thông thường nên sử dụng các trích dẫn đơn trong biểu thức grep cho tính di động trên các shell.
mkc

Shell bourne có rất nhiều hành vi kỳ quặc mà chúng ta vẫn thấy công việc xung quanh trong mã shell hiện đại, ví dụ [ x"$foo" = x"bar" ].
jordanm

bshNó không phải là Bourne Shell. Tên này chỉ bị lạm dụng cho Bourne Shell trên AIX. bshđúng hơn là một cái vỏ được tôi giới thiệu vào năm 1984 tại H.Berkeep AG trên UNOS (bản sao UNIX đầu tiên). Lưu ý rằng AIX không tồn tại vào năm 1984.
schily

Câu trả lời:


21

Các ^nhân vật như là một từ đồng nghĩa của |ngày trở lại từ vỏ Thompson . Chúng được giới thiệu cùng lúc trong Unix v4 và được đề cập cùng nhau trong trang man . Sven Mascheck đề cập đến điều đó ^có lẽ là [được giới thiệu] vì lý do thuận tiện cho các thiết bị đầu cuối chỉ dành cho chữ hoa, trong đó việc gõ |là một phần của một nỗi đau .

Shell Thompson đã mất từ ​​lâu, nhưng vỏ Bourne kế thừa vẫn giữ nguyên cú pháp (mặc dù trang man của nó chỉ đề cập đến |).

Các vỏ kế tiếp như tro, bash và ksh chỉ hiểu |là ký tự ống. Bạn sẽ không tìm thấy một vỏ Bourne thực tế trên các biến thể unix mã nguồn mở vì trong một thời gian dài không có sự phát hành mã nguồn mở của vỏ Bourne. (Tôi nghĩ OpenSolaris bao gồm một, nhưng nó không được chấp nhận ở nơi khác vì vào thời điểm đó, nó đã bị lỗi thời bởi các triển khai mới hơn).

Đặc tả kỹ thuật Unix đơn không đề cập đến ^như một ký tự đặc biệt, điều đó có nghĩa là các vỏ POSIX sẽ hiểu nó theo nghĩa đen. Tôi không nghĩ đã từng có một biến thể hoàn toàn tuân thủ POSIX của vỏ Bourne (chỉ triển khai độc lập).

^là đặc biệt trong zsh khi tùy chọn extendedglobđược bật, nhưng không ở chế độ tương thích sh của nó. Ở chế độ mặc định, nó đi chệch khỏi POSIX theo nhiều cách.

Tôi khuyên bạn nên trích dẫn ^trong một biểu thức thông thường dù sao cho rõ ràng. Trích dẫn biểu thức chính quy trong một kịch bản bất kể ký tự nào xuất hiện trong đó.

¹ Trừ khi ký tự đầu tiên của một biểu thức khung trong một khuôn mẫu ký tự đại diện, nơi !là nhân vật phủ định tiêu chuẩn nhưng việc triển khai cũng có thể giải thích ^theo cách tương tự.


Cảm ơn, toàn bộ chủ đề TUHS từ năm 2003 đã được khai sáng.
Greg Hewgill

Để đầy đủ, bạn có thể muốn đề cập đến điều ^đặc biệt ở fishchỗ nó là toán tử chuyển hướng, rc/ estrong đó là toán tử ghép , hoặc csh / tcsh / bash / zsh để mở rộng lịch sử khi nó là ký tự đầu tiên của dòng lệnh.
Stéphane Chazelas


3

Có, OpenSolaris bao gồm nguồn Bourne Shell nhưng nguồn đó không khả dụng.

Một phiên bản duy trì và có tính di động cao của nguồn Bourne Shell có thể được tìm thấy ở đây trong schily-*.tar.bz2kho lưu trữ.

Đây là phần liên quan của nguồn trong cmd.c:

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

Bạn thấy đấy, điều này không liên quan đến một lớp vỏ cụ thể (ví dụ như lớp vỏ của Thompson) nhưng thực tế là trong những năm 1970 vẫn còn có các chữ hoa chỉ có các thiết bị đầu cuối xung quanh.

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.