Как подключить вывод к 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 
  • Передайте флаг фона (&) через expect и ssh
  • Что вызывает повреждение сегментации в обслуживании?
  • Как выполнить xargs grep для вывода grep с пробелами?
  • Каковы режимы readline, раскладки клавиш и их привязки по умолчанию?
  • Как я могу манипулировать подкаталогами в оболочке?
  • Отфильтруйте пути из текстового файла, который глубже, чем их непосредственный предшественник
  • Как я могу интерполировать текстовый файл трехмерных координат (X, Y, Z) на регулярную сетку?
  • Используйте #! / Bin / sh или #! / Bin / bash для совместимости с Ubuntu-OSX и простоты использования и POSIX
  • Отсроченное расширение
  • Отправка вывода из 'dd' в awk / sed / grep
  • bash добавляет дополнительные одинарные кавычки
  • Linux и Unix - лучшая ОС в мире.