Проміжки поруч з трубами


17

Я бачив history | grep blahі history |grep blah; а history|grep blahтакож працює, хоча, здається, ніхто ніколи не використовує його.

Чи є якесь значення в просторах (наприклад, для передачі в / з різних команд потрібне різне використання пробілів), або це завжди довільно?


13
Читання, в основному.
Jasonwryan

1
|Труба або ;крапка з комою використовують більшість оболонок (bash, ksh, tcsh) як роздільник команд. коли не вкладено у цитаті пробіл до і після, не мають значення.
Архемар

Відповіді:


24

bashвизначає кілька метахарактерів . Від man bash:

метахарактер
Характер, який, коли не цитується, розділяє слова. Одне з наступних:
| &; () <> пробіл

Оскільки метахарактеристики розділяють слова, не має значення, чи вони оточені пробілами. Символ "труба" |- це метахарактер, і тому, як ви помітили, йому не потрібні пробіли навколо нього.

Слід зазначити , що [, ], {, }і =є НЕ метасимволу. Їх значення, навпаки, сильно залежить від того, чи вони оточені заготовками.

Приклади того, коли пробіли є і не потрібні

Як ви помітили, не має значення, чи |оточений він просторами. Розглянемо кілька прикладів, які зазвичай плутають користувачів bash. Поміркуйте:

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

Вище згадані парени змушують dateкоманду запускатись у нижній частині. Тому (і )є метасимволу, не потрібно ніяких прогалин. На противагу:

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

Оскільки {і не} є метахарактеристиками, оболонка трактується як одне слово. Замість того, щоб шукати команду, вона шукає команду з назвою . Оскільки він не знайде його, виходить помилка.{date}date{date}

Ще одна поширена проблема - testкоманда. Наступні успішно працюють:

$ [ abc ] && echo Yes
Yes

Видаліть пробіли, і виникла помилка:

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

Оскільки [і не] є метахарактеристиками, оболонка трактується як одне слово, а результат, як і в прикладі, є помилкою.[.bashrc]date

Виписки про призначення також чутливі до пробілів. Наступне завдання успішне:

$ v=date
$ echo $v
date

Додайте пробіл і завдання не вдається:

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

У вищесказаному оболонка тимчасово встановлюється vпорожньою, а потім виконує dateкоманду.

Додавання пробілу раніше =також спричиняє збій, але з іншої причини:

$ v =date
bash: v: command not found

Тут оболонка намагається виконати команду vаргументом =date. Помилка полягає в тому, що вона не знайшла жодної команди, названої v.


1
Нещодавно я став жертвою заяви про призначення. У мене були пробіли до і після =. Знадобився час, щоб налагодити.
зверху

3

Труби дозволяють використовувати вихід програми як вхід іншої ...

Що стосується просторів, то це лише питання читабельності / уподобання персоналу на кшталт @jasonwryan.

Один пробіл до і після "|" є нормою….

Ви також можете використовувати його з стовпцем -t, щоб не просто зробити ваш один вкладиш акуратним, але і ваш вихід.

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

Є один випадок, коли корисно не використовувати пробіли. Якщо ви не використовуєте американсько-американський макет, можливо, ви будете змушені використовувати деякі комбінації, наприклад, AltShiftLдля введення труби. Незважаючи на те, що сама по собі це не є проблемою, одним із наслідків є те, що іноді ви також вводите символи, що не друкуються, перед або після цього символу. Наприклад, на французькій клавіатурі Macbook Pro я повинен використовувати AltShiftLдля введення |. Коли ви швидко набираєте текст, ви можете випадково ввести це: 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

Якщо ви не знаєте, що AltShiftSpaceвводить інший простір (пробіл, що не порушується ( U + 00A0 )), може бути важко зрозуміти таку помилку:zsh: command not found:  tail


1

Єдине значення просторів у даному випадку - це естетика.
Або іншими словами, корисні для того, щоб зробити команди зручнішими для людини.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.