LINUX.ORG.RU

Выполнить команду с пайпом из одной переменной и записать результат в другую

 , , , ,


1

3

Например, есть тестовый скрипт:

#!/bin/bash
var1="cat $0"
var2=$($var1)
echo "${var2}"
В результате выполнения получим его исходный код. Но если в var1 будет пайп — произойдёт ошибка:
#!/bin/bash
var1="cat $0 | grep bash"
var2=$($var1)
echo "${var2}"

$ ./pipe.sh 
cat: |: No such file or directory
cat: grep: No such file or directory
cat: bash: No such file or directory
#!/bin/bash
var1="cat $0 | grep bash"
var2=$($var1)
echo "${var2}"
Собственно вопрос — как в данном случае сделать выполнение команды с пайпом и записать результат в переменную? Гугл с ответом не помог.

Ответ на: комментарий от h578b1bde
#!/bin/bash
var1="cat $0 | grep bash"
eval "var2=\$($var1)"
echo "${var2}"
anonymous ()

cat $0 | grep bash

Binary file (standard input) matches

А что вы вообще пытаетесь сделать? Зачем вам писать код в переменную? Для повторного использования кода существуют функции.

Zmicier ★★★★★ ()
Ответ на: комментарий от Xenius

почему не var2=$(eval $var1) ?

Потому что:

f() { cat $file | grep bash; }
a="$(f)"
echo "$a"
Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

А что вы вообще пытаетесь сделать?

Subj:> Выполнить команду с пайпом из одной переменной и записать результат в другую

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

Ты не понял задачу и даешь неверное решение.

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

А что вы вообще пытаетесь сделать? Зачем вам писать код в переменную?

В бесконечном цикле с задержкой (sleep) запускаются несколько утилит и парсится их выхлоп дабы получить нужное значение (число), в зависимости от этого значения происходят те либо иные действия. Команды с пайпами нужны для того чтобы в выхлопах найти нужные значения, при этом хочется держать эти команды поближе к началу файла дабы в случае чего быстро подправить, также для связи утилиты с результатом её выполнения и большей гибкости используется ассоциативный массив.

h578b1bde ★☆ ()
Последнее исправление: h578b1bde (всего исправлений: 1)
Ответ на: комментарий от h578b1bde

при этом хочется держать эти команды поближе к началу файла дабы в случае чего быстро подправить

Для этого используются функции. См. выше.

Zmicier ★★★★★ ()
Ответ на: комментарий от anonymous

Как видите, наоборот — это задача была поставлена неверно.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Ты не прав. Я отвечал на вопрос. Проблема TC'a в постановке задачи, мне из него клещами тянуть интереса никакого нет. А так-то любую КОНКРЕТНУЮ задачу можно решить ОДНОРАЗОВО более чем одним способом.

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

Для этого используются функции

declare -A Commands=( \
		['FOO']="/usr/bin/foo" \
		['BAR']="/usr/bin/bar" \
		…
	)
…
declare -A Results
for key in "${!Commands[@]}"; do
		command="${Commands[${key}]}"
		eval "result=\$($command)"
		…
		Results["${key}"]="${result}"
done
h578b1bde ★☆ ()
Последнее исправление: h578b1bde (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Зачем вам писать код в переменную?

Если ты про cat $0 | grep bash — это был всего лишь пример.

h578b1bde ★☆ ()
Ответ на: комментарий от h578b1bde

Да блин.

#!/bin/bash

declare -a Commands=( FOO BAR )
FOO() { /usr/bin/foo; }
BAR() { /usr/bin/bar | grep 'quux'; }

declare -A Results
for fn in "${Commands[@]}"; do
    Results[$fn]=$($fn)
done

P.S. Классные у вас отступы.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Можно и так, да. Просто вначале почему-то подумал что хранение в ассоциативном массиве будет более логичным чем подстановка имени нужной функции во время выполнения.

P.S. Классные у вас отступы.

Если это насчёт двойной табуляции — цикл находится на другом уровне вложенности, при копипасте недосмотрел.

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