LINUX.ORG.RU

emerge ведёт себя странно

 , ,


2

3
#!/bin/bash
echo "Start full upgrade?"
read answer
if [ "$answer" = "y" ] || [ "$answer" = "yes" ] || [ "$answer" = "д" ] || [ "$answer" = "да" ]
then
echo "Syncing portage tree..."
eix-sync
echo "\nUpgrading world..."
emerge -avuDN world --keep-going=y world && \
echo "\nRebuilding live..." && \
emerge -a @smart-live-rebuild && \
echo "\nRebuilding preserved..." && \
emerge -a @preserved-rebuild && \
echo "\nRevdep-rebuild..." && \
revdep-rebuild -- -aD && \
echo "\nUpgrading python..." && \
python-updater -- -aD && \
echo "\nCleaning perl..." && \
perl-cleaner --all -- -a
fi

При выполнении этапа с python-updater emerge вежливо спросил, продолжать ли действие (как и должно быть в случае с "-a"), но сам себе ответил на этот вопрос и действие продолжил. Чзх и как сделать так, чтобы он ждал моей р?

★★

На будущее: вместо цепочек && \ можно делать set -e / set +e.

mtk
()

Вместо:

echo "\nUpgrading world..."
emerge -avuDN world --keep-going=y world && \
echo "\nRebuilding live..." && \
emerge -a @smart-live-rebuild && \
echo "\nRebuilding preserved..." && \
emerge -a @preserved-rebuild && \
echo "\nRevdep-rebuild..." && \
revdep-rebuild -- -aD && \
echo "\nUpgrading python..." && \
python-updater -- -aD && \
echo "\nCleaning perl..." && \
perl-cleaner --all -- -a
сделайте
echo "\nUpgrading world..."
emerge -avuDN world --keep-going=y world
echo "Rebuilding live..."
emerge -a @smart-live-rebuild
echo "Rebuilding preserved..."
emerge -a @preserved-rebuild
echo "Revdep-rebuild..."
revdep-rebuild -- -aD
echo "Upgrading python..."
python-updater -- -aD
echo "Cleaning perl..."
perl-cleaner --all -- -a

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Мне бы хотелось, чтобы в случае обвала одного процесса остальные не выполнялись, но и шелл не закрывался (как с выше предложенным set -e).

Valdor ★★
() автор топика
Ответ на: комментарий от Valdor

Шелл закрывается только когда в нем тоже стоит set -e, разве нет? Тогда и все приложения, возвращая ненулевой статус, будут прибивать родительский шелл.

Немножко собственного мнения: скрипты-однострочники с цепочками - нечитаемое неотлаживаемое говно.

mtk
()
Ответ на: комментарий от mtk

Да, действительно. Убрал «&& \», выставил set -e. Работает, как надо. И ещё один вопрос не в тему. Я для видимости раскрасил вывод echo вот так: «echo »\n\e[1;32mSyncing portage tree...\e[0m"". При выполнении из консоли - работает, а при выполнении из скрипта - так и выводит со всеми \n и прочим. Чзх?

Valdor ★★
() автор топика
Ответ на: комментарий от Valdor

Я всегда делаю в скриптах:

red='\e[0;31m'
green='\e[0;32m'
reset='\e[0m'

echo -e "${red}Red message${reset}"
echo -e "${green}Green message${reset}"

Ну и далее:

msg_error() {
  echo -e "${red}$@${reset}"
}


msg_success() {
  echo -e "${green}$@${reset}"
}

mtk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.