Разделить команду bash на несколько частей многократного использования - PullRequest
1 голос
/ 16 февраля 2020

Как я могу разбить команду, которая использует трубы на разные части?

У меня есть следующая рабочая команда bash:

RESULT=$(find "/path/to/releases" -maxdepth 0 -type d -print0 | xargs -r -0 ls -1 -t | tail -n 1)

Я бы лучше разделил трубы на несколько переменных, например, так что я могу повторно использовать RESULT1 или RESULT2 где-то еще:

RESULT1=$(find "/path/to/releases" -maxdepth 0 -type d -print0)

if [ -n ${RESULT1} ]; then
  RESULT2=${RESULT1} | xargs -r -0 ls -1 -t
  RESULT3=${RESULT2} | tail -n 1
]

Возможно ли это? сначала проверьте, действительно ли первая часть что-то находит, прежде чем перейти к следующему каналу.

Обновление № 2: Решено так; Использовал несколько приведенных выше примеров, чтобы упростить объяснение моей проблемы. Вот фактический код.

DEPLOY_PATH="/data/www"
KEEP_RELEASES=3
function cleanup() {
      RELEASES=()
      OLDEST_RELEASE=

      for item in "${DEPLOY_PATH}"/releases/* ; do
        [[ -L ${item} || ! -d ${item} ]] && continue
        [[ -z ${OLDEST_RELEASE} || ${item} -ot ${OLDEST_RELEASE} ]] && OLDEST_RELEASE=${item}
        RELEASES+=("${item}")
      done

      if [ "${#RELEASES[@]}" -gt 0 ] && [ "${#RELEASES[@]}" -gt "${KEEP_RELEASES}" ]; then
        rm -rf "${DEPLOY_PATH}"/releases/$(basename "${OLDEST_RELEASE}")
        cleanup
      fi
}

К сожалению, цепочка с "find" и pipe вроде xargs не всегда лучший выбор. Imo это делает мой скрипт больше при использовании обычного bash массива.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

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

find_release(){
    find "/path/to/releases" -maxdepth 0 -type d -print0
}

list_by_time(){
    xargs -r -0 ls -1 -t
}

tail_1(){
    tail -n 1
}

# Then you can do :
find_release | list_by_time | tail_1
0 голосов
/ 16 февраля 2020

Да, это возможно:

RESULT1=$(find "/path/to/releases" -maxdepth 0 -type d)
RESULT2=$(echo "$RESULT1" | xargs -r ls -1 -t)
RESULT3=$(echo "$RESULT2" | tail -n 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...