Я видел history | grep blah
и history |grep blah
; и history|grep blah
также работает, хотя никто, кажется, никогда не использует его.
Есть ли какое-либо значение в пробелах (например, для передачи в / из разных команд требуется разное использование пробелов), или это всегда произвольно?
|
pipe или;
точка с запятой используются большинством shell (bash, ksh, tcsh) в качестве разделителя команд. когда не заключено в кавычки, пробелы до и после являются неуважительными.Ответы:
bash
определяет несколько метасимволов . Отman bash
:Поскольку метасимволы разделяют слова, не имеет значения, окружены ли они пробелами. Символ трубы
|
, является метасимволом и, следовательно, как вы заметили, ему не нужны пробелы вокруг него.Следует отметить , что
[
,]
,{
,}
и=
являются не метасимволы. Их значение, напротив, сильно зависит от того, окружены ли они пробелами.Примеры, когда пробелы есть и не нужны
Как вы заметили, не имеет значения,
|
окружены ли пробелы. Давайте рассмотрим некоторые примеры, которые обычно путают пользователей bash. Рассмотреть возможность:Паренсы выше заставляют
date
команду выполняться в подоболочке. Поскольку(
и)
являются метасимволами, пробелы не нужны. В отличие от:Поскольку
{
и не}
являются метасимволами, оболочка рассматривается как одно слово. Вместо того, чтобы искать команду, она ищет команду с именем . Поскольку он не находит, возникает ошибка.{date}
date
{date}
Другая распространенная проблема -
test
команда. Следующее работает успешно:Удалите пробелы и произойдет ошибка:
Потому
[
и]
являются не метасимволы, лечит оболочки[.bashrc]
как одно слово , и результат, так же , как вdate
примере, является ошибкой.Операторы присваивания также чувствительны к пробелам. Следующее задание выполнено успешно:
Добавьте пробел и назначение завершится неудачно:
В приведенном выше описании оболочка временно устанавливается
v
пустой и затем выполняетdate
команду.Добавление пробела перед
=
также вызывает сбой, но по другой причине:Здесь оболочка пытается выполнить команду
v
с аргументом=date
. Ошибка в том, что не найдено ни одной команды с именемv
.источник
=
. Потребовалось время для отладки.Каналы позволяют использовать выходные данные программы как входные данные другой ...
Что касается пробелов, это просто вопрос читабельности / предпочтения персонала, как упомянуто @jasonwryan.
Один пробел до и после "|" это норма ....
Вы также можете использовать его с колонкой -t, чтобы сделать не только аккуратную линию, но и вывод.
источник
В одном случае полезно не использовать пробелы. Если вы не используете американско-американскую раскладку, вас могут заставить использовать некоторые комбинации, например, AltShiftLдля ввода канала. Хотя это само по себе не является проблемой, одним из следствий этого является то, что иногда вы также вводите непечатаемые символы до или после этого символа. Например, на французской клавиатуре Macbook Pro мне приходится использовать AltShiftLдля ввода
|
. Когда вы печатаете быстро, вы можете случайно напечатать это: AltShift( L, Space)Если вы не знаете, что AltShiftSpaceвводит другой пробел (неразрывный пробел ( U + 00A0 )), трудно понять следующую ошибку:
zsh: command not found: tail
источник
Единственное значение пробелов в этом случае - эстетика.
Или, другими словами, полезно сделать команды более читабельными для человека.
источник