4

Я не очень понимаю, как второй || пункт работает. Я понимаю, что если пакеты разные, то выполняется rm -r node_modules . Однако я не понимаю, как второй || работает

cmp package.0.json node_modules/package.1.json || { rm -r node_modules || :; npm install; cp package.json node_modules/; }

2 ответа2

2

cmdA || cmdB Фрагмент cmdB означает «Запустить cmdA и, если он не работает (завершается с кодом выхода, отличным от 0), запустить cmdB ».

С https://stackoverflow.com/q/3224878/4482039: двоеточие : в bash это команда, которая ничего не делает.

Таким образом, rm -r node_modules || :; ... фрагмент может быть интерпретирован как:

  1. Запустите rm -r node_modules .
  2. Если это не удается (поскольку файл / каталог node_modules не существует или у нас нет прав), ничего не предпринимайте (игнорируйте ошибку)
  3. Запустите остаток строки.

Это способ игнорировать ошибки, потому что в этом случае ошибки ожидаются. В частности, для rm этот способ более безопасен, чем флаг -f поскольку он не заставляет удалять файлы, которые rm обычно отказывается удалять.

0

|| оценивает правую сторону только в том случае, если состояние выхода с левой стороны отличное от нуля (обычно это происходит при сбое). Итак, согласно этому шаги:

  1. cmp package.0.json node_modules/package.1.json
  2. Только если предыдущая команда не выполнена, выполните следующие действия
  3. Запустите rm -r node_modules
  4. Если шаг 3 завершается неудачей, ничего не предпринимайте (: как команда no-op )
  5. Запустите npm install
  6. Запустите cp package.json node_modules/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .