#bash #stdout #stderr
#bash #стандартный вывод #stderr
Вопрос:
Прошу прощения, если это действительно простой вопрос, но я не смог найти в Google ничего для «перенаправить stdout и stderr в bash script» и «перенаправить вывод bash script на другой bash script».
Я знаю, что это перенаправит stdout и stderr на log.txt
, но я не уверен, как перенаправить его на скрипт bash.
java -jar build/libs/bot-kt-1.1.3.jar > log.txt 2>amp;1
В идеале что-то, что ведет себя так, как указано выше, и выглядит так
java -jar build/libs/bot-kt-1.1.3.jar > "./script.sh" 2>amp;1 # script.sh uses the $1 argument for input
Комментарии:
1.
java -jar build/libs/bot-kt-1.1.3.jar ## don't ##> "./script.sh" 2>amp;1
надеюсь, вы не делали этого, что перезаписывает ваш скрипт2. Скрипт — это просто an
echo
, и у меня есть VCS, но спасибо за справедливое предупреждение3. Покажите результат, который вы ожидаете от
jar
, stdout и stderr. что вы ожидаете, когда есть оба?4. Это Java-программа, поэтому stderr будет отслеживанием стека из-за какой-то ошибки. pastebin.com/raw/pizCj5PF Вот что я получаю при выполнении первой команды, которую я ввел в своем примере
5. Поскольку командная строка имеет ограничение, и вы ожидаете, что трассировки стека могут быть длинными, я бы отказался от идеи использования командной строки и чтения из стандартного файла в вашем скрипте
Ответ №1:
Вы можете использовать xargs для перемещения данных из канала в аргумент:
java -jar build/libs/bot-kt-1.1.3.jar 2>amp;1 | xargs ./script.sh
передать все как один аргумент:
java -jar build/libs/bot-kt-1.1.3.jar 2>amp;1 | xargs --null ./script.sh
Комментарии:
1. @Mika: обратите внимание, что, кроме
xargs
того, важным моментом в этом ответе является использование канала|
для связи между двумя процессами.2. Будет ли это печатать все выходные данные в качестве 1 аргумента? Поскольку это то, что мне нужно
3. @Mika, если вы используете
xargs --null ./script.sh
его, должен передать один аргумент.4. Я только что попробовал
java -jar build/libs/bot-kt-1.1.3.jar 2>amp;1 | xargs --null ./notify.sh
с notify.sh быть « #!/bin/bash echo «»$1″» «, нет выхода5. Интересно, что ваше второе решение отлично работает
cat log.txt
. Это результат, который я получаю из первой команды в моем первоначальном вопросе: pastebin.com/raw/pizCj5PF Означает, что перенаправление отлично работает для файлов, а ваше отлично работает для cat, но не для стандартного вывода, который не завершается?
Ответ №2:
Для этого можно использовать подстановку команд:
./script.sh $(java -jar build/libs/bot-kt-1.1.3.jar 2>amp;1)
В дополнение к ответу perreal, если ваш скрипт можно изменить на чтение из стандартного файла, вместо ожидания параметра, вы также можете использовать канал:
java -jar build/libs/bot-kt-1.1.3.jar 2>amp;1 | ./script.sh
Комментарии:
1. Если
script.sh
это простоecho ""$1""
, то ни один из них не повторяет ничего, даже если jar работает нормально2. Вы получаете обратно свое приглашение?
3. Какой смысл в скрипте, если он просто повторяет его ввод? Это скрипт-заполнитель?
4. Хорошо, если ваша Java-программа выдает непрерывный вывод, который вы хотите обработать с помощью своего скрипта, тогда, пожалуйста, пересмотрите мое второе решение, т. Е. Прочитайте Ввод из stdin внутри скрипта. Простой тестовый скрипт выглядит следующим
while read line; do echo "script processed ${line}"; done
образом . Если вы просто передаете вывод Java-программы в этот скрипт, вы должны увидеть вывод, даже когда Java-программа все еще запущена. Единственное отличие с точки зрения скрипта заключается в том, что фактическая обработка переместится в телоwhile
цикла — , и ваш ввод будет внутри${line}
, а не внутри$1
.