Как подключить вывод к sh скрипту и передать его команде?

Для этого я был Googling и искал Stack, но не нашел точной вещи, которую я хочу сделать. На самом деле я пока не могу обдумать это.

Итак, допустим, у меня есть скрипт sh, который является только оболочкой gzip (как пример). В командной строке я хочу передать вывод чего-то (например, mysqldump ) в мой скрипт. Затем этот скрипт должен взять вход и канал, чтобы до gzip.

Пример командной строки:

mysqldump somedb | myscript> somefile.dmp.gz

Пример myscript (что-то я пробовал):

 #!/usr/bin/env sh read inp command="echo \"$inp\" | gzip" eval $command 

Вероятно, в этом примере много чего не так. Пожалуйста помоги? 🙂

Решение (для других, ищущих его)

Благодаря приведенным ниже объяснениям я теперь понимаю, что выполнение команды в SH-скрипте будет просто принимать входные данные в сценарий так же, как и когда команда выполнялась напрямую.

Итак, в этом случае:

кошачий файл | GZIP

будет делать то же самое, что:

MyScript:

 #!/usr/bin/env sh gzip 

кошачий файл | ./myscript

Поэтому я хотел бы отметить, что в моем случае возникла и другая проблема: в моем реальном сценарии я попытался проверить, был ли поток ввода, прочитав его следующим образом:

 read inp if [ -z "$inp" ]; then echo "No input" exit; fi 

Оказывается, после read inp входной канал пуст.

3 Solutions collect form web for “Как подключить вывод к sh скрипту и передать его команде?”

 #!/bin/sh gzip -c 

Этого было бы достаточно.

 $ mysqldump ... | ./script >out.gz 

gzip -c будет считывать несжатые данные на своем стандартном вводе и записывать сжатые данные в стандартный вывод.

Стандартный ввод обеспечивается каналом, а стандартный вывод перенаправляется в файл. Трубопровод и перенаправление обрабатываются вызывающей оболочкой.

Несколько более сложный пример, который примет выражение sed в командной строке и преобразует вход в соответствии с этим, или просто пересылает данные, если выражение не использовалось:

 #!/bin/sh if [ -n "$1" ]; then sed -e "$1" else cat fi 

(здесь, используя sed -e "" был бы тот же эффект, что и cat , но мне нужен более сложный пример)

 $ utility | ./script "1,5d" >out 

… удалит первые пять строк вывода из utility .

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

Сказав это, это будет делать то, что задает ваш вопрос:

 #!/bin/sh gzip "$@" 

Чтобы использовать read , чтобы прочитать какой-либо ввод, чтобы проверить, является ли он пустым или нет, вам нужно будет использовать оболочку, такую ​​как zsh которая может хранить любое значение байта в своих переменных, например:

 #! /bin/zsh - if LC_ALL=C read -ru0 -k1 byte; then # one byte was read, the input is not empty (printf %s "$byte"; cat) | gzip else echo >&2 No input fi 

Или используйте некоторую форму кодирования:

 #! /bin/sh - # get the value of the first byte as octal: byte=$(od -An -N1 -vto1 | tr -cd 0-7) if [ -n "$byte" ]; then (printf "\\$byte"; cat) | gzip else echo >&2 No input fi 
  • Как читать и делать min / max / avg из потока NMEA
  • Выполнить функцию readline без привязки клавиш?
  • Сценарий оболочки для перемещения файлов между двумя каталогами
  • Есть ли версия команды «Найти», которая сохраняет свое состояние?
  • Как сделать grep на удаленном компьютере и распечатать строку, содержащую эти слова?
  • Символы по глубине каталога
  • Удалять файлы с одинаковым именем в конце файла
  • Почему zsh и ksh93 решили быть несоответствующими при сопоставлении с образцом?
  • матч и замена в PNG-файле
  • Завершить второй (параллельный) процесс, если первый из них завершен
  • Перехват ввода и вывода из определенного исполняемого файла
  • Interesting Posts

    Записывающее приложение, которое может синхронизировать между Android и Linux по беспроводной сети и НЕ использовать какие-либо онлайн-сервисы?

    Компьютер больше не загружается в GRUB, он переходит прямо в Windows 10

    Крышка закрыта автоматически не обнаружена на thinkpad T430 с debian 9

    Какой файл загружается и выполняется неинтерактивной оболочкой без входа?

    sox: разделение звука на тишину, но оставление хвостов

    Как фильтровать STAT с помощью ps?

    Можно ли выполнить команду через ssh с пользователем nologin?

    Избегать вставки с помощью колеса мыши

    Как может порядок выполнения в оболочке, относящийся к перенаправлению, расстраиваться примерно 1 раз из 1000 в моей системе?

    Как обращаться (с LVM или DM (устройство)), когда привод ушел и вернулся в качестве нового блочного устройства

    Поддержка H.264 в Firefox (Iceweasel) 24

    Удалить определенное слово и пробел

    unix для печати до 3-го появления «/» в каждой строке

    Как отображать список пакетов, определенных определенным пакетом?

    Правило Udev для соответствия USB-устройству нескольких узлов

    Linux и Unix - лучшая ОС в мире.