LINUX.ORG.RU

Развернуть command substitution, прочитанный через cat или < из файла

 ,


0

2

Предположим, есть файл New_Text_File.txt с содержимым

date is $(date +%D)
time is $(date +%T)

Когда мы делаем cat New_Text_File.txt, то результат будет буквальным: date is $(date +%D) time is $(date +%T)

Можно ли сделать, чтобы когда мы читаем содержимое файла, выполнялась подстановка команд? Если точнее, меня интересует передача результатов подстановки в качестве аргументов в

cat New_Text_File.txt | xargs -0 ...

Дата и время выше даны чисто в качестве примера. Из реального использования - например, мне нужно поместить в тар файлы, перечисленные в текстовом файле. Большинство имен перечислены буквально, но есть и, допустим

find mydir -maxdepth 1 -type f -print0
(чтобы тар взял из директории все файлы, но без поддиректорий).


Самое близкое насколько я знаю это интерполяция в here-doc:

[d_a@work tmp]$ cat New_Text_File.txt 
cat <<EOF
date is $(date +%D)
time is $(date +%T)
EOF
[d_a@work tmp]$ . New_Text_File.txt 
date is 10/26/17
time is 15:23:05
Но как вы будете совмещать в нём строки разделённые '\n' и строки разделённые '\0' я не знаю :-(

d_a ★★★★★
()

Можно ли сделать, чтобы когда мы читаем содержимое файла, выполнялась подстановка команд?

Иначе говоря, вам нужна оболочка как препроцессор?

Какие проблемы?

#!/bin/bash

while read; do
    eval "printf '%s\n' \"$REPLY\""
done

Zmicier ★★★★★
()

У вас два противоречия.

Во-первых, одинаковый синтаксис для find будет как-то так:

files $(find mydir -maxdepth 1 -type f)
Во-вторых, смешаны текстовые и нетекстовые файлы, -print0 плохо совместим с текстом.

vodz ★★★★★
()
# cat > e
date is $(date +%D)
time is $(date +%T)
# print ${(e)"$(<e)"}
date is 10/27/17
time is 06:59:44
#
arto ★★
()
Ответ на: комментарий от Zmicier

Честно говоря, не распарсил - я только начинаю разбираться в командной строке и скриптах. Но в этом сообщении посоветовали способ, который работает, а немного почитав про eval, я подумал что в той конструкции он тоже должен сработать (и таки работает). Но что использовать лучше - eval или «sh -c»?

Kzer-Za
() автор топика
Ответ на: комментарий от Kzer-Za

Насколько я понимаю, sh -c будет вызывать экземпляр оболочки на каждую строку файла. Так? А eval?

Kzer-Za
() автор топика

Кажется это OOo, по soffice -invisible ******://пути-с-макросом($FILE). Ну, и работать по аргумент (т.е сам ($FILE)) макроса!

Ну, и в начале ODF надо поменять (какой подойдёт, неизвестно).

anonymous
()
Ответ на: комментарий от Kzer-Za

Насколько я понимаю, sh -c будет вызывать экземпляр оболочки на каждую строку файла. Так? А eval?

Вы с сами с собой говорите, потому вам и не отвечают.

Нет, не так. eval будет вызван на каждую строчку, а sh -c выполнит один скрипт, который получится после считывания вашего файла с добавкой echo. Первый вариант немного медленнее, но теоретически проще сделать проверки на всякие опасные вставки в ваш текст.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.