BASH: как отправить параметры и данные процессу на STDIN

Я пишу вызов curl, вы можете ввести пароль и параметры через STDIN (не вводите пароль в строку cmd).

Мне также нужно отправить данные POST на STDIN (большой объем данных, который не помещается в строку cmd).

Итак, из командной строки я могу успешно сделать это:

> curl -K --data-binary @- -other_non-pw_params
> -u "username:password"
> <User types ctrl-d>
> lots_of_post_data
> lots_of_post_data
> <User types ctrl-d>
> <User types ctrl-d>

Теперь... я пытаюсь сделать это в сценарии BASH...

Выдающий желаемое за действительное псевдокод:

{ echo '-u "username:password"'
  echo <ctrl-d>    |   cat dev/null   |   ^D
  echo lots_of_post_data
  echo lots_of_post_data
} | curl -K --data-binary @- -other_non-pw_params

person David Parks    schedule 08.07.2011    source источник
comment
Вы не за горами ... Я думаю, все, что вам нужно изменить, это ‹ctrl-d› на правильную escape-последовательность и т. д. Вы пробовали это?   -  person Flimzy    schedule 08.07.2011
comment
Понятия не имею, какую escape-последовательность я бы использовал.   -  person David Parks    schedule 08.07.2011
comment
Справочная страница echo сообщает вам, какие управляющие последовательности она поддерживает. Но я думаю, что ответ Игнасио верен — Bash не может закрыть STDOUT, а это действительно то, что вам нужно. Вам, вероятно, нужно что-то более сложное, чем сценарий оболочки, если вам нужно отправить Ctrl-D/EOF.   -  person Flimzy    schedule 08.07.2011


Ответы (3)


Ага! Для этого есть специальное решение для завивки.

Вы передаете все параметры в STDIN и оставляете --data-binary @- (или его эквивалент) в конце, тогда все, что после него, принимается как входные данные. Пример скрипта:

#!/bin/bash
{ echo '--basic'
  echo '--compress'
  echo '--url "https://your_website"'
  echo '-u "username:password"'
  echo '--data-binary @-'
  echo 'lots_of_post_data'
  echo 'lots_of_post_data'
} | curl --config -
person David Parks    schedule 08.07.2011

Используйте «здесь документ»:

curl --config - <<EOF
--basic
...
EOF
person Aaron Digulla    schedule 08.07.2011
comment
Хорошая идея, но работает ли это, если эти две строки, повторяющие «lots_of_post_data», заменены циклами для заполнения данных? - person David Parks; 08.07.2011
comment
Ах, нет. В этом случае ваше решение лучше. - person Aaron Digulla; 08.07.2011

Нет возможности имитировать EOF, как в Ctrl-D в терминале, чтобы вообще прекратить отправку данных в поток. Вам нужно будет найти другой способ сделать это, возможно, написав сценарий на более подходящем языке.

person Ignacio Vazquez-Abrams    schedule 08.07.2011