[Решено] Выполнить строку-значение переменной (bash)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
kt315e
Сообщения: 303
ОС: Linux Debian Jessie

[Решено] Выполнить строку-значение переменной

Сообщение kt315e » 12.02.2014 20:59

Код

Код: Выделить всё

S='ls > res'
$S

Вывод:

Код: Выделить всё

ls: невозможно получить доступ к >: Нет такого файла или каталога
ls: невозможно получить доступ к res: Нет такого файла или каталога

Нужна магия?

УУУ, глюпый.

Код: Выделить всё

S='ls > res'
eval $S
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [Решено] Выполнить строку-значение переменной

Сообщение drBatty » 13.02.2014 00:00

kt315e писал(а):
12.02.2014 20:59
Нужна магия?

когда вы пишете $S, то компилятор

2. меняет $S на ls > res

3. режет строку на три лексемы "ls" ">" "res"

4. считает первую лексему командой, а остальные лексемы -- операндами этой команды (в данном случае ls их считает именами файлов)

Почему я начал с п2? Потому-что до этого был п1

1. строка режется на операторы разделённые связками, такими как ;, <, >, >>, |, &, &&, ||, и т.п.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
kt315e
Сообщения: 303
ОС: Linux Debian Jessie

Re: [Решено] Выполнить строку-значение переменной

Сообщение kt315e » 04.04.2014 23:44

drBatty писал(а):
13.02.2014 00:00
kt315e писал(а):
12.02.2014 20:59
Нужна магия?

когда вы пишете $S, то компилятор

2. меняет $S на ls > res

3. режет строку на три лексемы "ls" ">" "res"

4. считает первую лексему командой, а остальные лексемы -- операндами этой команды (в данном случае ls их считает именами файлов)

Почему я начал с п2? Потому-что до этого был п1

1. строка режется на операторы разделённые связками, такими как ;, <, >, >>, |, &, &&, ||, и т.п.

Спасибо!
Что будет если просто написать ls > res? В чём разница в порядке обработки строки? Сначала выполгится п1? Непонятна логика почему сделано так по разному? Наверное неспроста?
Спасибо сказали:

Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: [Решено] Выполнить строку-значение переменной

Сообщение yars » 05.04.2014 00:40

drBatty
//режим зануды
компилятор

интерпретатор
/fixed.
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [Решено] Выполнить строку-значение переменной

Сообщение drBatty » 05.04.2014 09:43

kt315e писал(а):
04.04.2014 23:44
Что будет если просто написать ls > res?

1. сначала текст режется на операторы.
две штуки:
ls
>res

2. потом каждый оператор режется на лексемы

А вот если вы написали $S, то это считается одним оператором, и далее оператор уже режется на лексемы.

eval тем и отличается, что распознаёт операторы в строке. Например:

$

$ S="ls > ls" $ echo "$S" ls ls $ $S # один оператор ls: невозможно получить доступ к ls: Нет такого файла или каталога $ eval "$S" # оператор eval раскрывается в два ls, всё работает $ eval $S /bin/ls: невозможно получить доступ к ls: Нет такого файла или каталога # оператор eval получает два параметра, и собирает из них команду с параметрами


http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: