LINUX.ORG.RU

исполнение значения переменной баш.

 ,


0

1
$ a="watch \"(df -h |grep ^[/F];free -h|sed 's/  \*/ /g')|sed 8q\""
$a
sh: 1: (df -h |grep ^[/F];free -h|sed 's/ \*/ /g')|sed 8q: not found

:(

echo $a |bash

результат тот(который нужен . т.е исполнение команды воч с аргументом.)

собсвенно вопрос как в баше присвоит значение переменной что бы

её значение в командной строке баша давало тот же эффект что и непосредственное команда с аргументом?

Перемещено leave из talks

Ответ на: комментарий от qulinxao

Тебе видней? У меня баш, например.

Проверю сабж поздней

Deleted ()

1. Перепиши на трезвую голову. (Хотя в твоем случае, насколько я помню, не поможет.)
2. В general.

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

Звёздочка в выводе free вряд ли встретится, вероятно ТС имел ввиду замену двух или более пробелов на один — s/ \*/ /g. И, да, прочь из толксов с техническими вопросами!

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

это работает как и echo $a |bash

сам вопрос можно ли так сконструировать значение переменной что бы и её подставке выполнилось всё то что и непосредственная команда

т.е

если cmd args

то какая обёртывающая кострукция для «взятия указателя»

var = some_miracle on cmd args

что бы $var было тождественно непосредственному cmd args

например для a=ls path

что ls path что a=ls path; $a одно и тоже

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

Твой код фиксится до рабочего так:

$ a="watch \"\$(df -h |grep ^[/F];free -h|sed 's/  \*/ /g')|sed 8q\""
$ $a

Это конструкция $( ... ) (man 1 bash | grep 'Command Substitution'). Если использовать её, то на место первого аргумента bash подставит результат выполнения некоторой команды в этой конструкции. Если же её не использовать, то watch получит первым аргументом саму команду, а не результат её выполнения — об этом и говорит сообщение об ошибке в ПП.

Note: тем не менее, я не понимаю почему корректно работают конструкции с пайпом и eval-ом =)

Но суть проблемы я понял. Решение — испоьзовать массив вместо строки. Потому что bash может смотреть на исполняемое значение в строке так и только так:

  • "$a" — это одна команда, вне зависимости от предполагаемого количества аргументов, экранируемых символов, и т. д. ls /dev (например) — одна команда; ls — не команда, а /dev — не аргумент, но ls /dev — одна команда.
  • $a — bash всё-таки попытается отделить команду от аргументов и правильно их выполнить, но может ошибиться из-за пробелов:
    • a='ls arch' && $a == ls arch (здесь всё нормально);
    • a='ls "arch linux"' == ls \"arch linux\" (т. е. ls для директорий "arch и linux", но не для "arch linux");

Хинт: суть в том, что мы не можем достаточно (достаточно для корректности) точно задать команду в строке; во втором примере мы не можем указать начало и конец первого аргумента, bash это делает за нас. А для массива мы сможем точно задать команду и каждый аргумент в частности.

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

замечательно.

.

если дана произвольная строка(т.е набор символов) которая если как есть вбить в консоль - нечто вменяемо исполняемое.

т.е предложеный метод автоматически позволяет такую строку заворачивать в переменную?

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

корочь

задачка(кому и проблема) дана произвольная строка - о которой достоверно известно что при исполнении в шелле это рабочий код.

функция на входе получает такую строку - и выдаёт строку вида имя_переменой=нечто.

что бы в контексте где видна имя_переменой.

т.е переменная как алиас - давало в результате эффект исходной строки шелл кода.

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

Нет, в первой части поста я всё-таки не прав. Это не фикс, а какая-то вакханалия, которая вообще хрен знает как работает. Мне стоило почитать ман watch, тогда бы я раньше узнал о том, что он сам запускает интерпретатор для переданного аргумента.

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

Нет такой функции. Что не отменяет решения об исопльзовании массива вместо строки:

$ WATCH=("watch" "(df -h |grep ^[/F];free -h|sed 's/  \*/ /g')|sed 8q")
$ "${WATCH[@]}"
Аналогично и для всего остального: просто указываем отдельно команду и каждый аргумент, не заботясь ни о чём более.

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