Không gian bên cạnh đường ống


17

Tôi đã thấy history | grep blahhistory |grep blah; và history|grep blahcũng hoạt động, mặc dù dường như không ai sử dụng nó.

Có bất kỳ ý nghĩa nào trong các không gian (ví dụ: đường ống đến / từ các lệnh khác nhau yêu cầu sử dụng các khoảng trắng khác nhau), hay nó luôn luôn tùy ý?


13
Dễ đọc, chủ yếu.
jasonwryan

1
|ống hoặc ;dấu chấm phẩy được sử dụng bởi hầu hết các shell (bash, ksh, tcsh) như là dấu phân cách của các lệnh. khi không được bao trong trích dẫn khoảng trắng trước và sau là không phù hợp.
Archemar

Câu trả lời:


24

bashđịnh nghĩa một số siêu ký tự . Từ man bash:

metacharacter
Một ký tự mà khi không được trích dẫn sẽ phân tách các từ. Một trong những điều sau đây:
| &; () <> tab không gian

Bởi vì các ký tự phân tách các từ riêng biệt, việc chúng được bao quanh bởi các khoảng trắng không quan trọng. Biểu tượng ống |, là một metacharacter và do đó, như bạn nhận thấy, nó không cần khoảng trống xung quanh nó.

Lưu ý rằng [, ], {, }, và =không metacharacters. Ý nghĩa của chúng, ngược lại, phụ thuộc mạnh mẽ vào việc chúng được bao quanh bởi khoảng trống.

Ví dụ về khi không gian là và không cần thiết

Như bạn nhận thấy, không có vấn đề gì nếu |được bao quanh bởi các không gian. Chúng ta hãy xem xét một số ví dụ thường gây nhầm lẫn cho người dùng bash. Xem xét:

$ (date)
Sun Mar  1 12:47:07 PST 2015

Các parens ở trên buộc datelệnh phải được chạy trong một subshell. Bởi vì ()là siêu nhân vật, không cần khoảng trắng. Ngược lại:

$ {date}
bash: {date}: command not found

{không phải} là siêu ký tự, shell được coi là một từ. Thay vì tìm kiếm lệnh, nó tìm kiếm một lệnh có tên . Bởi vì nó không tìm thấy một, một kết quả lỗi.{date}date{date}

Một vấn đề phổ biến khác là testlệnh. Sau đây hoạt động thành công:

$ [ abc ] && echo Yes
Yes

Xóa các khoảng trắng và xảy ra lỗi:

$ [abc] && echo Yes
bash: [abc]: command not found

Bởi vì [không phải] là siêu ký tự, shell xử lý như một từ đơn và kết quả, giống như trong ví dụ, là một lỗi.[.bashrc]date

Báo cáo chuyển nhượng cũng nhạy cảm với không gian. Nhiệm vụ sau đây thành công:

$ v=date
$ echo $v
date

Thêm một khoảng trắng và gán không thành công:

$ v= date
Sun Mar  1 12:55:05 PST 2015

Trong phần trên, shell tạm thời đặt vthành rỗng và sau đó thực thi datelệnh.

Thêm một khoảng trắng trước =cũng gây ra lỗi nhưng vì một lý do khác:

$ v =date
bash: v: command not found

Ở đây, shell cố gắng thực thi lệnh vvới đối số =date. Lỗi là do không tìm thấy lệnh nào được đặt tên v.


1
Gần đây tôi đã trở thành nạn nhân của tuyên bố chuyển nhượng. Tôi đã có không gian trước và sau =. Mất một lúc để gỡ lỗi.
topher

3

Ống cho phép bạn sử dụng đầu ra của một chương trình làm đầu vào của một chương trình khác ...

Về không gian, vấn đề dễ đọc / ưu tiên nhân sự như @jasonwryan đã đề cập.

Một thanh không gian trước và sau "|" là chuẩn mực ....

Bạn cũng có thể sử dụng nó với cột -t, để không chỉ làm cho một lớp lót của bạn gọn gàng, mà còn cả đầu ra của bạn.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp

2

Có một trường hợp có thể hữu ích khi không sử dụng khoảng trắng. Nếu bạn không sử dụng bố cục Mỹ-Mỹ, bạn có thể buộc phải sử dụng một số kết hợp như AltShiftLđể nhập một đường ống. Mặc dù đây không phải là vấn đề khó khăn, nhưng một hậu quả là đôi khi bạn cũng nhập các ký tự không in trước hoặc sau ký tự đó. Ví dụ, trên bàn phím Macbook Pro của Pháp, tôi phải sử dụng AltShiftLđể nhập liệu |. Khi bạn nhập nhanh, bạn có thể vô tình gõ này: AltShift( L, Space)

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |         t   a
0000020    i   l  nl

Nếu bạn không biết rằng AltShiftSpacenhập một không gian khác (không gian không phá vỡ ( U + 00A0 )), có thể khó hiểu được các lỗi sau:zsh: command not found:  tail


1

Ý nghĩa duy nhất của không gian trong trường hợp này là tính thẩm mỹ.
Hay nói cách khác hữu ích để làm cho các lệnh dễ đọc hơn đối với con người.

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.