Может ли кто-нибудь объяснить смысл этого заявления оболочки? - PullRequest
2 голосов
/ 27 мая 2011

Я запутался со следующим оператором оболочки.

 export changeset=`hg parents | awk -F: '/^changeset:/ { print $2 }' | sed -e 's/ //g' -e 1q` 

Как это работает?

Спасибо

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Эта команда выполняет следующие действия: -

  • hg parents запускает родительскую команду mercurial
  • awk -F: '/^changeset:/ { print $2 }' запускает awk, читая ее ввод и для любой строки, которая начинается с changeset itпечатает второе поле в строке (поля разделяются:)
  • sed -e 's/ //g' -e 1q `читает все введенные данные, удаляет пробелы и печатает первую строку
  • export changeset= Берет все междуbackticks запускает это как последовательность команд и присваивает результат переменной changeset.

Символ канала объединяет команды, в результате чего стандартный вывод (STDOUT) одной программы становится стандартным вводом (STDIN).) другого.

Итак, в итоге, после выполнения переменная changeset будет содержать второе поле из первой строки команды hg parents, которая началась с changeset.

1 голос
/ 27 мая 2011

Ответ Стива Вита объясняет, что происходит. Ваш конвейер может быть упрощен, хотя. В вашем заявлении на awk, поскольку ваш разделитель равен :, вы можете сказать awk -F: '$1 == "changeset" {print $2}'. Кроме того, поскольку awk и sed имеют много перекрывающихся функций, вы можете написать (все по одной строке, если хотите):

export changeset=$(
  hg parents | 
  awk -F: '$1 == "changeset" {gsub(/ /, "", $2); print $2; exit}'
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...