Оценка фигурных скобок в Linux - PullRequest
0 голосов
/ 12 июня 2018

Я заметил, что мы можем использовать фигурные скобки, чтобы сделать некоторые команды намного короче, поскольку они вычисляются в виде списка аргументов.

Ввод:

echo a{,b,c}

Вывод:

a ab ac

Как заставить то же поведение при передаче аргументов из файла?

Ввод:

cat file.txt | xargs echo

Вывод:

a{,b,c}

Ожидаемый результат - такой же, как в предыдущем примере.

Ответы [ 3 ]

0 голосов
/ 12 июня 2018
  1. xargs вызывает echo, как указано в $ PATH, а не встроенное эхо оболочки.
  2. проверяет список расширений bash : расширение скобок происходит первымтак что у него не будет возможности расширяться в этом трубопроводе.

Вам придется сделать что-то вроде

while read -r line; do eval echo "$line"; done < file.txt

, которое подвергает вас всевозможным противным атакам, если кто-то помещает в этот файл что-то вредоносное.

0 голосов
/ 12 июня 2018

Кроме вопроса, почему вы хотите это сделать ... Я предлагаю следующее:

добавить строку в файл:

echo 'a{,b,c}' > /tmp/foo

поместить строку в переменную:

export thing=`cat /tmp/foo`

eval строка:

eval $thing

Если у вас было несколько таких файлов в файле, запустите файл через цикл и оцените значение цикла:

echo 'a{,b,c}' >> /tmp/foo
echo 'a{,b,c}' >> /tmp/foo
echo 'a{,b,c}' >> /tmp/foo

for i in `cat /tmp/foo`; do eval echo $i; done
0 голосов
/ 12 июня 2018

То, что расширение {} является функцией bash / zsh, поэтому вам нужно явно запустить его через любую из этих оболочек, в вашем случае будет (используя -I<STRING>, чтобы позволить xargs заменить его встрока перед запуском):

cat file.txt |xargs -I@ bash -c 'echo @' 
...