Как установить по умолчанию ответы [Yn] для команды очистки Ruby gem clean?

Я регулярно использую команду Ruby gem clean, чтобы поддерживать в рабочем состоянии локальный репозиторий драгоценных камней.

Однако из-за проблем с зависимостями часто команда возвращает такое приглашение, как:

XXXXX-1.0.6 depends on [YYYYYY (~> 0.8.4)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn]  

Хотя это достаточно просто, это требует ручного вмешательства (для ответа [Yn]), и, следовательно, это мешает мне создать простой сценарий cron для автоматизации этого процесса.

Есть идеи, как настроить ответ на эти gem запросы по умолчанию?


person Anupam    schedule 05.11.2011    source источник


Ответы (4)


У вас должна быть команда yes, в версии OSX есть следующее:

YES(1)                    BSD General Commands Manual                   YES(1)

NAME
     yes -- be repetitively affirmative

SYNOPSIS
     yes [expletive]

DESCRIPTION
     yes outputs expletive, or, by default, ``y'', forever.

HISTORY
     The yes command appeared in 4.0BSD.

4th Berkeley Distribution        June 6, 1993        4th Berkeley Distribution

Так что, возможно, это сработает:

yes n | gem clean

gem clean может читать непосредственно с терминала, а не со стандартного ввода. В этом случае вы могли бы expect возиться:

Expect - это программа, которая «разговаривает» с другими интерактивными программами в соответствии со сценарием. Следуя сценарию, Expect знает, чего можно ожидать от программы и каким должен быть правильный ответ. Интерпретируемый язык обеспечивает разветвление и структуры управления высокого уровня для управления диалогом. Кроме того, пользователь может взять на себя управление и при желании взаимодействовать напрямую, после чего вернуть управление скрипту.

Таким образом, вы можете написать expect скрипт, чтобы отвечать на ожидаемые запросы с помощью «y» или «n» по желанию.

person mu is too short    schedule 05.11.2011

Это должно работать:

echo|gem clean

Это будет действовать как возврат в командной строке. 'y' по умолчанию, он будет работать gem clean до завершения.

person Thilo    schedule 05.11.2011
comment
Я только что проверил это, и, похоже, он работает не так, как ожидалось. В моем окружении я кормлю драгоценный камень чистым в таких ситуациях. Итак, я побежал ... echo 'n' | драгоценный камень был чистым, и он относился к нему как к y и все равно вычищал драгоценные камни. - person Matt Farmer; 05.11.2011
comment
Вы правы - однако, я думаю, это все равно помогает. Отредактировано, чтобы не вводить в заблуждение. - person Thilo; 05.11.2011

Ответ Тило самый простой. Однако если вам нужно использовать «n», вам не повезло. Некоторый поиск нашел этот поток с некоторым образцом кода Java: Java: обнаружение запроса пользователя при запуске пакетного сценария из Java

Я немного изменил его для этой ситуации, и я думаю, что это позволит вам более консервативный вариант использования "n" в качестве выбора по умолчанию. Конечно, этот код можно преобразовать в сценарий bash, если вы предпочитаете, чтобы класс java не работал в ваших заданиях cron, но я оставлю это кому-то более опытному с bash.

У меня сейчас нет простого способа протестировать этот код, поэтому дайте мне знать, как он работает. :)

public static void main(final String... args) throws IOException, InterruptedException {
    final Runtime runtime = Runtime.getRuntime();
    final String command = "..."; // cmd.exe
    final String matchString = "Continue with Uninstall? [Yn] ";
    final String response = "n";

    final Process proc = runtime.exec(command, null, new File("."));

    final BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    final BufferedWriter output = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));

    StringBuilder sb = new StringBuilder();
    char[] cbuf = new char[100];
    while (input.read(cbuf) != -1) {
        sb.append(cbuf);
        if (sb.substring(sb.length() - matchString.length(), sb.length()).equals(matchString)) {
            output.write(response);
            output.newLine();
            output.flush();
        }
    }
    System.out.println(sb);
}
person Matt Farmer    schedule 05.11.2011

В последних версиях gem есть флажки для этого. Например, чтобы игнорировать зависимости, используйте -I. Для автоматического удаления исполняемых файлов используйте -x. Большинство параметров эквивалентны ответу yes на подсказку определенного класса. Чтобы ответить «нет» вместо «да», добавьте перед расширенным именем опции no-.

Options:
    -a, --[no-]all                   Uninstall all matching versions
    -I, --[no-]ignore-dependencies   Ignore dependency requirements while
                                     uninstalling
    -D, --[no-]check-development     Check development dependencies while uninstalling
                                     (default: false)
    -x, --[no-]executables           Uninstall applicable executables without
                                     confirmation
    -i, --install-dir DIR            Directory to uninstall gem from
    -n, --bindir DIR                 Directory to remove binaries from
        --[no-]user-install          Uninstall from user's home directory
                                     in addition to GEM_HOME.
        --[no-]format-executable     Assume executable names match Ruby's prefix and suffix.
        --[no-]force                 Uninstall all versions of the named gems
                                     ignoring dependencies
        --[no-]abort-on-dependent    Prevent uninstalling gems that are
                                     depended on by other gems.
    -v, --version VERSION            Specify version of gem to uninstall
        --platform PLATFORM          Specify the platform of gem to uninstall
        --vendor                     Uninstall gem from the vendor directory.
                                     Only for use by gem repackagers.

Например, чтобы стереть все свои драгоценные камни, вы можете использовать gem uninstall -Iax

person wirefox    schedule 29.06.2018