Расширение параметров оболочки происходит после высокого -синтаксического анализа каналов разбивает строку на структурированные команды, поэтому тело вашей функции выполняется так, как если бы вы написали
ps ax '|' grep -v grep '|'
-, то есть с трубами в качестве буквальных аргументов для ps
. Вот почему вы получаете ошибку от ps
(, а не от grep
! )жалуется, что не понимает аргумент |
.
Это можно исправить двумя способами:
pg
. Это кажется мне лучшей версией, но ваш реальный сценарий может быть более сложным. Если есть реальная потребность в чем-то подобном, вместо этого используйте функцию, содержащую конвейер:
pg_cmd_1() {
ps ax | grep -v grep | $1
}
pg=pg_cmd_1
и продолжайте в том же духе -. Это позволит вам определять дополнительные функции и динамически изменять переменную pg
, чтобы использовать их при необходимости.
Кроме того, в настоящее время ваш скрипт пытается запустить ps ax | grep -v grep | xenon
, что, я думаю, по-прежнему не то, что вам нужно (отсутствует grep
? ).
Обычное соглашение состоит в том, что квадратные скобки группируют необязательные элементы. У вас есть несколько уровней вложенных квадратных скобок для интерпретации.Квадратные скобки группируют такие элементы, как круглые скобки в математических выражениях -все, что заключено в квадратные скобки, следует рассматривать как единое целое.
Вся эта конструкция заключена в квадратные скобки -, что означает, что весь "фрагмент" является необязательным -он может быть там или нет, как единое целое.
Давайте предположим, что мы хотим, чтобы он был там, поэтому давайте удалим самый внешний уровень квадратных скобок, и тогда у нас останется:
-n number-to-stat[:max-size[:min-size][:num-directories[:chunk-size]]]
Это означает, что если присутствует что-либо из исходной конструкции, оно должно начинаться с -n
, за которым следует number-to-stat
. Обратите внимание, что number-to-stat
является , а не необязательным в этом случае -, если -n
присутствует, то за должен следовать number-to-stat
. Все, что следует за этим, заключено в еще одну группу квадратных скобок, так что оно тоже, как единое целое, необязательно.
Если что-то следует за number-to-stat
, это должно быть в этой форме:
:max-size[:min-size][:num-directories[:chunk-size]]
Это означает, что следующая часть выражения должна быть:max-size
. За этим может следовать:min-size
-или нет, как вам нравится... Но это само по себе находится в другой группе квадратных скобок, так что это одна единица, независимая от остальных.
Независимо от того, присутствует ли :min-size
, вы также можете дополнительно добавить :num-directories
, и если вы это сделаете, вы можете затем дополнительно добавить к нему :chunk-size
. Если вы не поставили :num-directories
, вы не можете поставить :chunk-size
, потому что они вместе находятся в одной группе квадратных скобок.
Чтобы ответить на ваш прямой вопрос, если вы вообще используете опцию -n
, вы не можете опустить number-to-stat
, которая потребуется. Вы можете опустить :max-size
, но тогда, если вы это сделаете, вы не сможете предоставить:min-size
(Я знаю, вы сказали, что все равно не хотите ). После этого можно указать :num-directories
, а :chunk-size
можно опустить. И, конечно же, если вы не предоставите -n
, то вы не сможете предоставить любую остальную часть.
И, конечно же,все это зависит от предположения, что в приведенном вами примере квадратные скобки используются так, как они обычно используются в документации.