Что такое команда «отменить» в сценарии оболочки базового уровня? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь преобразовать старый установочный скрипт в Dockerfile и постоянно сталкиваюсь с таким синтаксисом:

  # unpack the tar
  reportandprint "..Unpacking archive\n"
  suWrap "tar xf $DISTDIR/$ISTAR"
  undo "rm -rf $INSROOT/$ISDIR/*"

  # make /var and /etc trees
  reportandprint "..Creating cache directory\n"
  reportcmdandeval "mv $INSROOT/$ISDIR/var $VARROOT/$ISDIR"
  undo "rm -rf $VARROOT/$ISDIR"
  suWrap "ln -s $VARROOT/$ISDIR $INSROOT/$ISDIR/var"
  suWrap "mkdir $INSROOT/$ISDIR/var/catalogs"
  undo "rm -f $INSROOT/$ISDIR/var"

Может ли кто-нибудь объяснить мне использование здесь команды «отменить»? Это запасной вариант, если предыдущая строка не выполняется? Это не похоже на обычное использование, и все, что я смог найти в Интернете, - это множество людей, которые хотят «отменить» что-то, что они случайно сделали в оболочке :)

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 07 августа 2020

Скорее всего, это вспомогательные функции в скрипте. Посмотрите, как они определены в нем.

Я предполагаю, что undo хранит список команд для отмены выполнения скриптов на данный момент (вероятно, активированных с помощью trap на INT / EXIT). suWrap будет запускать строку как суперпользователь, а reportandprint будет префикс и форматировать текстовый вывод.

Вспомогательные функции полезны, чтобы сделать ваш сценарий короче и легче читается. Например. Допустим, вы хотите остановить свой скрипт и распечатать сообщение об ошибке на stderr (2).
Вы могли go: echo "Error: this error" >&2; exit 1 каждый раз. Но лучше определить функцию, которая сделает это за вас, и использовать ее во всем скрипте.

errexit() {
  printf "Error:\t %s\n" "$@" >&2
  exit 1
}
 
errexit "this error"
errexit "that error"

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

...