Выполните команду оболочки из сценария оболочки, не останавливаясь, если ошибка происходит

Вы даже можете смоделировать очередь, используя только один стек. Второй (временный) стек может быть смоделирован стеком рекурсивных вызовов метода вставки.

Принцип остается неизменным при добавлении нового элемента в очередь:

  • Вам необходимо перенести элементы из одного стека в другой временный стек, чтобы изменить их порядок.
  • Затем вставьте новый элемент для вставки во временную стопку
  • Затем перенесите элементы обратно в исходную стопку
  • Новый элемент будет в нижней части стек, и самый старый элемент находится сверху (первым должен быть извлечен)

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

public class SimulatedQueue<E> {
    private java.util.Stack<E> stack = new java.util.Stack<E>();

    public void insert(E elem) {
        if (!stack.empty()) {
            E topElem = stack.pop();
            insert(elem);
            stack.push(topElem);
        }
        else
            stack.push(elem);
    }

    public E remove() {
        return stack.pop();
    }
}
22
задан Jonathan Leffler 2 July 2009 в 16:51
поделиться

5 ответов

Попробуйте:

invoke-rc.d tomcat stop > /dev/null 2>&1 || true

Немного предыстории:

user@tower: # true
user@tower: # echo $?
0
user@tower: # false
user@tower: # echo $?
1

user@tower: # which true
/bin/true
user@tower: # which false
/bin/false

Реальное реальное решение смотрит на сценарий инициализации tomcat, чтобы узнать, как он узнает, запущен ли tomcat :) Это Кстати, вы не приставаете к нему без нужды.

См. этот пост о другом предложении отключить / установить + e. Хотя это решит вашу непосредственную проблему, вы можете обнаружить, что вам нужно недавно отключенное поведение в вашем собственном скрипте, особенно если вы копируете файлы.

Это одна из основных причин, по которым были сделаны true и false, помимо создания Make-файлы ведут себя так, как ожидалось, в различных средах сборки.

Кроме того, set + e не совсем переносимый, то есть некоторые версии Solaris (и даже Dash) .. но я сомневаюсь, что это вас беспокоит.

31
ответ дан 29 November 2019 в 03:50
поделиться

Отключите параметр «немедленно выйти» с помощью set + e , запустите вашу команду, затем, при необходимости, снова включите ее с помощью set -e :

set +e
invoke-rc.d tomcat stop
set -e  # optional

См. раздел 4.3.1 руководства Bash для объяснения встроенной функции set и всех ее различных опций (которых много).

28
ответ дан 29 November 2019 в 03:50
поделиться

Если invoke-rc.d tomcat stop - единственное, что вы хотите защитить от сбоя, возможно, invoke-rc.d tomcat stop || правда может? Это никогда не должно иметь ненулевой статус выхода.

1
ответ дан 29 November 2019 в 03:50
поделиться

Используйте команду bash set для временного отключения поведения выхода при ненулевом значении.

set +e
invoke-rc.d tomcat stop
set -e
4
ответ дан 29 November 2019 в 03:50
поделиться

Попробуйте перенаправить стандартную ошибку в файл ... что-то вроде 2> myerror.

-3
ответ дан 29 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: