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
Форумы портала PHP.SU :: Версия для печати :: задать переменную *nix [2]
Форумы портала PHP.SU » Серверное администрирование » Администрирование *nix » задать переменную *nix

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

16. DlTA - 12 Июля, 2013 - 14:18:26 - перейти к сообщению
тоже немного поэксперементировал
инзанчально скрипт test.sh быз запускаем, убрал с него эту привелегию
и сделал
отработало точно так же как если бы скрипт был запускаем,
значит дело не в том является ли скрипт запускаем, а в том чтоб это был именно скрипт, текст которого будет подключен


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

понятно что можно было прост сделать TA="tata", но все же
в чем разница между именем скрипта, и переменной в данном случае?
17. EuGen - 12 Июля, 2013 - 14:24:36 - перейти к сообщению
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!

?
18. DlTA - 12 Июля, 2013 - 14:48:04 - перейти к сообщению
EuGen пишет:
имеете ввиду это
нет
подразумевается что текст скрипта не в файле находится, а получен из вне

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

echo 'TEMPVAR="123"'|sh.sh
19. EuGen - 12 Июля, 2013 - 14:50:21 - перейти к сообщению
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!

?
20. DlTA - 12 Июля, 2013 - 14:54:56 - перейти к сообщению
EuGen пишет:
Кажется, понял
все же не,
у вас в примере на входе в скрипт подается имя файла со скриптом,
а я говорю о случае когда на вход подается текст скрипта, не имя файла со скриптом, а именно сам выполняемый код.
(Добавление)
налалог
<?php eval('code');
21. EuGen - 12 Июля, 2013 - 15:11:21 - перейти к сообщению
DlTA
22. DlTA - 12 Июля, 2013 - 15:33:23 - перейти к сообщению
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?
23. EuGen - 12 Июля, 2013 - 15:43:30 - перейти к сообщению
DlTA
Опять неясно. Судя по конвейерной передаче, Вы пытаетесь передать содержимое файла в eval. Но зачем, если выше уже обсудили, как это делается (через ".")? Да и зачем пытаться присвоить значение переменной, которая будет использоваться только в том коде, который подключается?
24. DlTA - 12 Июля, 2013 - 15:56:38 - перейти к сообщению
присваивание это для проверки работы,
это я уже откланился от основной темы,
вопрос стоит eval работает с stdin или только с args
судя из тестов получается что eval обрабатывает только то что подается в виде аргумента, на входной поток не смотрит
(Добавление)
пример чтоб не не смущала рабоат с файлами
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo 'echo "123"'|eval

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

тут вообще не пойму что тогда не так
25. DeepVarvar - 12 Июля, 2013 - 16:53:04 - перейти к сообщению
Чтобы перехватить результат работы какого-то кода, его можно заключить в апострофы.
26. DlTA - 12 Июля, 2013 - 17:10:57 - перейти к сообщению
$ eval `echo '123'`
-bash: 123: команда не найдена
(Добавление)
а вот так работает)
$ eval `echo 'echo "123"' `
123

 

Powered by ExBB FM 1.0 RC1