Как вы интерпретируете этот сложный синтаксис справочной страницы?

Расширение параметров оболочки происходит после высокого -синтаксического анализа каналов разбивает строку на структурированные команды, поэтому тело вашей функции выполняется так, как если бы вы написали

ps ax '|' grep -v grep '|'

-, то есть с трубами в качестве буквальных аргументов для ps. Вот почему вы получаете ошибку от ps(, а не от grep! )жалуется, что не понимает аргумент |.

Это можно исправить двумя способами:

  1. Просто запишите команду в функцию вместо использования переменной pg. Это кажется мне лучшей версией, но ваш реальный сценарий может быть более сложным.
  2. Если есть реальная потребность в чем-то подобном, вместо этого используйте функцию, содержащую конвейер:

    pg_cmd_1() {
        ps ax | grep -v grep | $1
    }
    pg=pg_cmd_1
    

    и продолжайте в том же духе -. Это позволит вам определять дополнительные функции и динамически изменять переменную pg, чтобы использовать их при необходимости.


Кроме того, в настоящее время ваш скрипт пытается запустить ps ax | grep -v grep | xenon, что, я думаю, по-прежнему не то, что вам нужно (отсутствует grep? ).

2
14.10.2020, 02:24
1 ответ

Обычное соглашение состоит в том, что квадратные скобки группируют необязательные элементы. У вас есть несколько уровней вложенных квадратных скобок для интерпретации.Квадратные скобки группируют такие элементы, как круглые скобки в математических выражениях -все, что заключено в квадратные скобки, следует рассматривать как единое целое.

Вся эта конструкция заключена в квадратные скобки -, что означает, что весь "фрагмент" является необязательным -он может быть там или нет, как единое целое.

Давайте предположим, что мы хотим, чтобы он был там, поэтому давайте удалим самый внешний уровень квадратных скобок, и тогда у нас останется:

-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, то вы не сможете предоставить любую остальную часть.

И, конечно же,все это зависит от предположения, что в приведенном вами примере квадратные скобки используются так, как они обычно используются в документации.

4
18.03.2021, 22:57

Теги

Похожие вопросы