Перенаправление стандартного вывода / stderr в сценарий bash

#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 .