Как запустить команду Linux с переменной окружения в JAVA [duplicate]

Мне кажется, что нарезка - это не столько проблема, которая отличается от того, когда ваши собственные классы и программы плохо архивируются / разработаны.

Если я передаю объект подкласса в качестве параметра для метод, который принимает параметр суперкласса типа, я должен, конечно, знать об этом и знать внутренне, вызываемый метод будет работать только с объектом суперкласса (aka baseclass).

Мне кажется, необоснованное ожидание того, что предоставление подкласса, где запрашивается базовый класс, каким-то образом приведет к конкретным результатам подкласса, вызовет проблему разрезания. Его либо плохой дизайн при использовании метода, либо недостаточная реализация подкласса. Я предполагаю, что это обычно результат жертвовать хорошим дизайном ООП в пользу целесообразности или повышения производительности.

3
задан Jay Foreman 25 August 2013 в 01:35
поделиться

1 ответ

Java exec не может запускать такие командные команды. Если вы хотите запустить команду оболочки, вам нужно явно вызвать оболочку; например,

Process proc = run.exec(new String[]{"/bin/sh", "-c", "echo 5 | ./prog"});

Для получения более подробной информации о том, что делает Java с этим, прочитайте javadocs для exec(String) и exec(String[]) . Обратите внимание, что это «методы удобства», и вам нужно следовать цепочке ссылок на основные методы для полного понимания того, что говорит javadoc.

Если вы хотите получить более подробную информацию о том, как обрабатываются Java это, есть исходный код ...

Если вы хотите глубже понять, почему Java не не обрабатывает сам синтаксис оболочки, вам, вероятно, необходимо пройти глубокое погружение в архитектуру и философию систем UNIX / Linux и разделение проблем между приложением, операционной системой и командной оболочкой. Обратите внимание, что существуют разные разные оболочки, каждая из которых имеет (потенциально) разные правила для цитирования, разделения аргументов, перенаправления, труб и т. Д.

Объяснение решения:

  • Причиной разделения команды вручную является то, что exec(String) не будет разделять команду на на одну команду и аргументы правильно. Это невозможно. Это пример, когда в конвейере есть две команды .
  • Причина использования «sh» - это ... ну ... вам нужна оболочка для синтаксического анализа и обработки командной строки оболочки. Команда exec Java не поддерживает синтаксис оболочки ... как объясняет javadoc.
  • Назначение опции «-c» объясняется «man sh». В принципе, sh -c "a b c" означает «использовать« sh »для запуска командной строки« ab c ».

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

12
ответ дан Stephen C 21 August 2018 в 13:50
поделиться
  • 1
    Почему необходимо разделять /bin/sh и -c или где я могу найти подробную информацию о работе Runtime.exec(...)? – Jay Foreman 25 August 2013 в 01:53
  • 2
    Я не вижу ничего, что могло бы объяснить мне эту проблему с /bin/sh и -c в javadoc и не так ли? Итак, да, я посмотрел туда первым. – Jay Foreman 25 August 2013 в 02:07
  • 3
    Javadocs объясняют, как Java разделяет аргументы. Вам также нужно понять, как аргументы команды обрабатываются в Linux (как на уровне оболочки, так и на уровне syscall) ... и что синтаксис для труб, перенаправление и т. Д. Реализуются оболочкой NOT операционной системы. – Stephen C 31 March 2015 в 22:37
Другие вопросы по тегам:

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