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)
не будет разделять команду на на одну команду и аргументы правильно. Это невозможно. Это пример, когда в конвейере есть две команды . exec
Java не поддерживает синтаксис оболочки ... как объясняет javadoc. sh -c "a b c"
означает «использовать« sh »для запуска командной строки« ab c ». FWIW, технически возможно построить и запустить конвейер исключительно на Java (т.е. не полагаясь на внешнюю оболочку), но, как правило, не стоит усилий. Вы уже ввели зависимость от платформы, запустив внешние команды, поэтому дополнительная зависимость в форме конкретной команды и синтаксиса оболочки не делает вещи значительно хуже.
Вы можете использовать простое INSERT INTO ... SELECT
в этом случае:
INSERT INTO usevoucher (userID, voucherID)
SELECT userID, voucherID
FROM users
WHERE (<your-conditions>) AND voucherID IN (5, 6, 7, 8, ...)
Решение, основанное на вашем редактировании:
INSERT INTO ownsvoucher (userID, voucherID)
SELECT users.userID, vouchers.voucherID
FROM (users, vouchers)
LEFT JOIN ownsvoucher ov ON ov.userID = users.userID AND ov.voucherID = vouchers.voucherID
WHERE vouchers.active = 1 AND ov.voucherID IS NULL
В случае, если вы хотите Фильтр для конкретных voucherID
можно добавить AND vouchers.voucherID IN (5, 6)
.
blockquote>