Как по умолчанию ответы [Yn] для команды Ruby "gem clean" - PullRequest
6 голосов
/ 05 ноября 2011

Я регулярно использую команду 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 приглашений?

Ответы [ 4 ]

8 голосов
/ 05 ноября 2011

У вас должна быть команда 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 для ответа на ожидаемые запросы с помощью "y" или"n" по желанию.

1 голос
/ 05 ноября 2011

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

echo|gem clean

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

0 голосов
/ 29 июня 2018

Последние версии 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

0 голосов
/ 05 ноября 2011

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

Я изменил его несколько для этой ситуации, и я думаю, что это позволит вам более консервативно использовать «n» в качестве выбора по умолчанию. Конечно, этот код можно изменить в скрипт bash, если вы предпочитаете, чтобы в ваших заданиях cron не работал класс java, но я оставлю это кому-то более опытному с 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);
}
...