Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: задать переменную *nix [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: из скрипта в глобальной области
DlTA
Отправлено: 12 Июля, 2013 - 14:18:26
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




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


но возникла идея, а как подключить выполняемый текст не из файла а из веденного буфера
например:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $ TS='TA="tata"'
  2. $ . TS # не работает, ругается на отсутствие файла

понятно что можно было прост сделать TA="tata", но все же
в чем разница между именем скрипта, и переменной в данном случае?
 
 Top
EuGen Администратор
Отправлено: 12 Июля, 2013 - 14:24:36
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DlTA пишет:
значит дело не в том является ли скрипт запускаем, а в том чтоб это был именно скрипт, текст которого будет подключен

EuGen пишет:
Такой скрипт, в отличие от cat, будет успешно подключён (так как является текстом) и исполнен (так как является правильным sh-скриптом)

- я это и пытаюсь пояснить. Представьте себе, например, include в PHP - Вы не сможете подключить бинарный файл. "Исполнимый" - это я имел ввиду не вопрос разрешений (chmod), а то, можно ли файл исполнить как sh-скрипт, для чего нужно соблюдение двух условий - того, что файл является текстовым, и того, что файл является верным sh-скриптом.
chmod в примере выше сделан для того, чтобы система смогла включить скрипт sometest в список глобально определённых. Сравните:
CODE (bash):
скопировать код в буфер обмена
  1. user@host:~$ sudo chmod 400 /usr/bin/sometest
  2. user@host:~$ which sometest
  3. which: no sometest in (/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib/kde4/libexec:/usr/lib/qt/bin:/usr/share/texmf/bin:.)
  4. user@host:~$ . sometest foo.sh
  5. bash: sometest: No such file or directory

- по понятным причинам система более не считает sometest исполнимым глобально файлом, потому ". sometest" не трактуется как попытка исполнить глобальный скрипт, система ищет несушествущий файл "sometest" - что приводит к ошибке.

DlTA пишет:
понятно что можно было прост сделать TA="tata", но все же
в чем разница между именем скрипта, и переменной в данном случае?

- имеете ввиду это:
CODE (bash):
скопировать код в буфер обмена
  1. user@host:~$ cat foo.sh
  2. #!/bin/bash
  3. script="./bar.sh"
  4. . $script
  5. user@host:~$ cat bar.sh
  6. #!/bin/bash
  7. echo "Executed!"
  8. user@host:~$ ./foo.sh
  9. Executed!

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 12 Июля, 2013 - 14:48:04
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




EuGen пишет:
имеете ввиду это
нет
подразумевается что текст скрипта не в файле находится, а получен из вне

например
sh.sh пишет:
CODE (bash):
скопировать код в буфер обмена
  1. read PS
  2. . PS # а тут исполняется скрипт поданный на входе
  3.  

echo 'TEMPVAR="123"'|sh.sh

(Отредактировано автором: 12 Июля, 2013 - 14:49:01)

 
 Top
EuGen Администратор
Отправлено: 12 Июля, 2013 - 14:50:21
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DlTA пишет:
текст скрипта не в файле находится, а получен из вне

Не понял всё равно. В моём примере текст подключённого скрипта находится "извне" - в другом файле.
upd. Кажется, понял
CODE (bash):
скопировать код в буфер обмена
  1. user@host:~$ cat foo.sh
  2. #!/bin/bash
  3. . $1
  4. user@host:~$ cat bar.sh
  5. #!/bin/bash
  6. echo "Executed!"
  7. user@host:~$ ./foo.sh ./bar.sh
  8. Executed!

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 12 Июля, 2013 - 14:54:56
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




EuGen пишет:
Кажется, понял
все же не,
у вас в примере на входе в скрипт подается имя файла со скриптом,
а я говорю о случае когда на вход подается текст скрипта, не имя файла со скриптом, а именно сам выполняемый код.
(Добавление)
налалог
<?php eval('code');

(Отредактировано автором: 12 Июля, 2013 - 14:55:19)

 
 Top
EuGen Администратор
Отправлено: 12 Июля, 2013 - 15:11:21
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DlTA


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 12 Июля, 2013 - 15:33:23
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




CODE (bash):
скопировать код в буфер обмена
  1. $ cat ./test.sh
  2. #! /bin/bash
  3. TS='321'
  4. echo $TS
  5. $ cat ./test.sh |eval #ничего не делает
  6. $ echo 'echo "123"'|eval # тоже пусто

что не так с eval?
 
 Top
EuGen Администратор
Отправлено: 12 Июля, 2013 - 15:43:30
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DlTA
Опять неясно. Судя по конвейерной передаче, Вы пытаетесь передать содержимое файла в eval. Но зачем, если выше уже обсудили, как это делается (через ".")? Да и зачем пытаться присвоить значение переменной, которая будет использоваться только в том коде, который подключается?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 12 Июля, 2013 - 15:56:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




присваивание это для проверки работы,
это я уже откланился от основной темы,
вопрос стоит eval работает с stdin или только с args
судя из тестов получается что eval обрабатывает только то что подается в виде аргумента, на входной поток не смотрит
(Добавление)
пример чтоб не не смущала рабоат с файлами
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo 'echo "123"'|eval

(Добавление)
$ TS='echo "123"'|eval $TS
-bash: 123: команда не найдена

тут вообще не пойму что тогда не так

(Отредактировано автором: 12 Июля, 2013 - 15:57:36)

 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Июля, 2013 - 16:53:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Чтобы перехватить результат работы какого-то кода, его можно заключить в апострофы.
 
 Top
DlTA
Отправлено: 12 Июля, 2013 - 17:10:57
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




$ eval `echo '123'`
-bash: 123: команда не найдена
(Добавление)
а вот так работает)
$ eval `echo 'echo "123"' `
123
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Администрирование *nix »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB