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

Я пишу скрипт CLI, который спрашивает серию вопросов прежде, чем сделать несколько вещей. Как я могу передать их как аргументы так, чтобы я не продолжал вводить их каждый раз, когда я хочу протестировать свой сценарий?

В основном это должно передать 4 объекта STDIN, как "text1 [ВХОДЯТ], text2 [ВХОДЯТ], text3 [ВХОДЯТ], text4 [ВХОДЯТ]" автоматически.

Да, я мог изменить свой сценарий для фактического чтения аргументов оболочки, но я не хочу делать это тот путь, так как это, как предполагается, работает больше как мастер.

Поиск чего-то как

SOMEPROGRAM myscript arg1 arg2 arg3 arg4

или

SOMEPROGRAM arg1 arg2 arg3 arg4 | myscript

Или что-то как этот. Есть ли такая программа?

4
задан 9 September 2011 в 10:35

7 ответов

Я понимаю, что Вы не хотите изменять myscript.

Относительно второго решения Вы просите, можно использовать printf:

printf '%s\n' text1 text2 text3 text4 | myscript

так, чтобы, определяя псевдоним для SOMEPROGRAM как:

alias SOMEPROGRAM="printf '%s\n'" 

Вы могли эффективно звонить

SOMEPROGRAM text1 text2 text3 text4 | myscript

Первая форма неоднозначна (с точки зрения SOMEPROGRAM), потому что это не знает где myscript конец опций и текстовые параметры запускаются, если myscript эффективно вызывается без любых опций. В этом случае Вы могли использовать функцию:

SOMEPROGRAM() {
  myscript="$1"
  shift
  printf '%s\n' "$@" | "$myscript"
}

так, чтобы Вы могли эффективно звонить

SOMEPROGRAM myscript text1 text2 text3 text4
6
ответ дан 23 November 2019 в 11:40

Так в основном Вы хотите передать каждый аргумент как строку к дочерней программе. Ниже сценарий, что циклы через все аргументы передали ti SOMEPROGRAM и печатает их как строку. Можно передать пустую строку ("входят, не вводя что-то прежде") путем передачи пустого аргумента как в SOMEPROGRAM yes '' | myscript.

#!/bin/bash
# This is "SOMEPROGRAM", it prints each argument as "answer" to  a program that
# must be piped. Usage: SOMEPROGRAM yes 1 no 2 | myscript
for arg; do
    echo "$arg"
done

Если всегда необходимо отвечать на "да" на сценарий, используйте coreutil yes:

yes | myscript

Если необходимо передать некоторое другое значение, сказать "нет":

yes 'no' | myscript
2
ответ дан 23 November 2019 в 11:40

Можно передать параметры, но это не будет работать, необходимо будет также изменить сценарий удара для принятия параметрических усилителей от командной строки также.

1
ответ дан 23 November 2019 в 11:40

Если Вы пишете, что сценарий затем просто использует getopts, таким образом, аргументы передаются сценариям, и затем можно ли использовать те args, как Вы хотите? Это - что-то, что Вы ищете?

http://wiki.bash-hackers.org/howto/getopts_tutorial

1
ответ дан 23 November 2019 в 11:40

С ударом можно сделать это:

myscript << END
arg1 
arg2
arg3
arg4
END

или

myscript <<< $'arg1\narg2\narg3\narg4\
1
ответ дан 23 November 2019 в 11:40

Для простых случаев путь enzotib описывает, это с передачей по каналу stdin из файла кажется разумным. Рассмотрите этот сценарий:

#!/bin/bash
read -p "What's your name?" name 
echo $name 
read -p "Age?" age 
echo $age
echo "Your name is " $name " and your age is "$age

вызовите его с:

echo -e "Foobar\n14\n" | ./namenage.sh 

-e должен включить escape-последовательности как \newline.

Foobar
14
Your name is  Foobar  and your age is 14

Отметьте, как волшебно, удар не печатает подсказку для чтения.

Однако для более сложных случаев, существует программа, названная expect для обработки интерактивных программ CLI, где необходимо ожидать следующей подсказки, прежде, чем ввести второе значение, и я предполагаю, что можно даже перейти при условиях.

1
ответ дан 23 November 2019 в 11:40

Я вполне уверен, Вы ищете, ожидают.

править: пример добавляется

  
#!/bin/bash  
USER="root"  
HOST="192.168.1.111"  
PASS="secret"  
expect -c "  
spawn ssh $USER@$HOST  
expect \"password:\"  
send \"$PASS\r\"  
interact  
"  

- из этого блога

1
ответ дан 23 November 2019 в 11:40

Другие вопросы по тегам:

Похожие вопросы: