Как расширить env var в ANSI C-подобной строке и использовать буквальный перевод строки?

Я использую herestring для передачи строки (два входных значения с символами новой строки) в качестве стандартного ввода в исполняемый файл установщика. Например, выполнение установщика с двумя входными данными /var/tmp и yes

#!/bin/bash
# run_installer.sh

./installer <<< $'/var/tmp\nyes\n'

Но мне нужно параметризовать входы.

e.g.

#!/bin/bash
# run_installer.sh
export INPUT1="$1"
export INPUT2="$2"

# does not work, it evaluates literally to: ./installer ${INPUT1} ${INPUT2}
./installer <<< $'${INPUT1}\n${INPUT2}\n'

Чтобы я мог выполнить это так:

./run_installer /var/tmp yes

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


person James Wierzba    schedule 31.01.2019    source источник
comment
Пожалуйста, объясните минус   -  person James Wierzba    schedule 31.01.2019
comment
Расширение оболочки происходит один раз. Вы можете использовать команду < <(printf "$1\n$2\n")   -  person KamilCuk    schedule 31.01.2019
comment
Это не имеет ничего общего со строками; это вопрос о том, как расширить переменные в $'', который не является специфичным для строки синтаксисом. У вас была бы точно такая же проблема с f / e, var=$'${INPUT1}\n${INPUT2}\n'   -  person Charles Duffy    schedule 31.01.2019
comment
@CharlesDuffy, я не знаю канонического имени для $'' в bash, какое имя лучше подходит для вопроса?   -  person James Wierzba    schedule 31.01.2019
comment
$'' также известен как строки, подобные ANSI C, хотя, по общему признанию, это довольно полный рот. То же самое происходит и с обычными одинарными кавычками; это можно было бы почти обобщить на Как нужно ли использовать переменные в строках с одинарными кавычками?, которые охватывают необходимые детали (относительно возможности переключения между типами кавычек в одной строке).   -  person Charles Duffy    schedule 31.01.2019
comment
@KamilCuk, лучше < <(printf '%s\n' "$1" "$2"), который не будет пытаться обрабатывать значения внутри переменных, как если бы они были частью строки формата (с обратной косой чертой, знаками % и т. д. небуквальными).   -  person Charles Duffy    schedule 01.02.2019


Ответы (1)


Пытаться:

./installer <<< "${INPUT1}"$'\n'"${INPUT2}"$'\n'

or:

EOL=$'\n'
./installer <<< "${INPUT1}${EOL}${INPUT2}${EOL}"

В любом случае, последний EOL ist не нужен, потому что он вставляется автоматически.

person Wiimm    schedule 31.01.2019
comment
Ты меня опередил, лол - person Paul Hodges; 31.01.2019
comment
Это не работает, установщику передается только один ввод, '/var/tmp\nyes\n', новые строки - это экранированный символ, а не буквальный перевод строки - person James Wierzba; 01.02.2019
comment
Я протестировал его с cat - <<< "${INPUT1}${EOL}${INPUT2}${EOL}", и результат in1\nin2\n\n (INPUT1/2 установлены на in1 и in2) - person Wiimm; 01.02.2019
comment
@JamesWierzba Это, безусловно, работает именно так, как задумано; см. ideone.com/RBicmM - person Charles Duffy; 01.02.2019
comment
@C.Duffy: оболочка - это bash. - person Wiimm; 01.02.2019
comment
@ Wiimm, мы оба согласны с этим, не так ли? - person Charles Duffy; 01.02.2019
comment
@CharlesDuffy и Вимм, это была моя ошибка. Я по ошибке использовал двойные кавычки как для EOL var, так и для herestring. Это работает. - person James Wierzba; 01.02.2019
comment
@C.Duffy Да! - person Wiimm; 01.02.2019