cat
не знает о сигналах echo
. Он получает состояние конца -из -файла на man pipe (7):
If all file descriptors referring to the write end of a pipe have been closed, then an attempt to read(2) from the pipe will see end- of-file (read(2) will return 0).
Однако для записи в канал существует SIGPIPE. См. ту же справочную страницу
Использование пасты, как в ответе @αғsнιη, но с более простой обработкой
while IFS=$'\t' read num value; do
declare "_$num=$value"
done < <(paste {one,two}.txt)
, затем
$ echo "$_21"
Hi how are you
$ echo "$_22"
Hello who are you
$ echo "$_23"
May I help you
eval "$(paste -d"_=''" /dev/null <(tr -d \" <one) /dev/null two /dev/null)"
paste
файлы/ввод с -d="..."
разделителями, определенными в списке.
мы использовали /dev/null
в качестве фиктивного ввода, чтобы сгенерировать первый _
и поместить содержимое второго файла two
в одинарную кавычку, чтобы избежать расширения каждого файла, если они содержат переменные, подстановку команд; как для ввода ниже:
один.txt:
"21"
"22"
"23"
два.txt:
"Hi $(date) how are you"
"Hello who are you"
"May I help you"
Выход::
_21='"Hi $(date) how are you"'
_22='"Hello who are you"'
_23='"May I help you"'
$ echo "${_21}"
"Hi $(date) how are you"
если вы хотите, чтобы они расширялись до того, как они будут назначены связанным переменным, измените команду на:
$ eval "$(paste -d"_=" /dev/null <(tr -d \" <one) two )"
$ echo "${_21}"
Hi Tue 24 Nov 2020 12:47:40 AM +0330 how are you