Как я могу разбить команду, которая использует трубы на разные части?
У меня есть следующая рабочая команда 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 массива.