Я пишу скрипт CLI, который спрашивает серию вопросов прежде, чем сделать несколько вещей. Как я могу передать их как аргументы так, чтобы я не продолжал вводить их каждый раз, когда я хочу протестировать свой сценарий?
В основном это должно передать 4 объекта STDIN, как "text1 [ВХОДЯТ], text2 [ВХОДЯТ], text3 [ВХОДЯТ], text4 [ВХОДЯТ]" автоматически.
Да, я мог изменить свой сценарий для фактического чтения аргументов оболочки, но я не хочу делать это тот путь, так как это, как предполагается, работает больше как мастер.
Поиск чего-то как
SOMEPROGRAM myscript arg1 arg2 arg3 arg4
или
SOMEPROGRAM arg1 arg2 arg3 arg4 | myscript
Или что-то как этот. Есть ли такая программа?
Я понимаю, что Вы не хотите изменять 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
Так в основном Вы хотите передать каждый аргумент как строку к дочерней программе. Ниже сценарий, что циклы через все аргументы передали 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
Можно передать параметры, но это не будет работать, необходимо будет также изменить сценарий удара для принятия параметрических усилителей от командной строки также.
Если Вы пишете, что сценарий затем просто использует getopts, таким образом, аргументы передаются сценариям, и затем можно ли использовать те args, как Вы хотите? Это - что-то, что Вы ищете?
С ударом можно сделать это:
myscript << END
arg1
arg2
arg3
arg4
END
или
myscript <<< $'arg1\narg2\narg3\narg4\
Для простых случаев путь 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-последовательности как \n
ewline.
Foobar
14
Your name is Foobar and your age is 14
Отметьте, как волшебно, удар не печатает подсказку для чтения.
Однако для более сложных случаев, существует программа, названная expect
для обработки интерактивных программ CLI, где необходимо ожидать следующей подсказки, прежде, чем ввести второе значение, и я предполагаю, что можно даже перейти при условиях.
Я вполне уверен, Вы ищете, ожидают.
править: пример добавляется
#!/bin/bash
USER="root"
HOST="192.168.1.111"
PASS="secret"
expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
interact
"
- из этого блога