Скрипты И Совметимость Операционных Систем, Рабочие файлы скриптов в Unix системах |
Здравствуйте, гость ( Вход | Регистрация )
Скрипты И Совметимость Операционных Систем, Рабочие файлы скриптов в Unix системах |
4.11.2008, 22:03
Сообщение
#1
|
|
Местная ТехПоддержка Группа: Администраторы Сообщений: 1 875 Регистрация: 18.7.2008 Из: Моск. Обл, г. королев, район Болшево Пользователь №: 221 Спасибо сказали: 220 раз |
Собственно перешел я на Linux и послал венды куда-подальше. Ну и вылез вопросец со скриптами, ибо пути в Unix системах немного отличаются от аналогичных в Windows. В результате был загажен немного рут. Но дело даже не в этом. Некоторые скрипты, к примеру RSS лент, отлично пашут и не гадят своими файлами. Поэтому предлагаю нашим разработчикам подумать над этой проблемой и выбрать отптимальный код для совместимости операционок.
2 Setuper: Илья, тестовую площадку подготовлю, если что |
|
|
10.11.2008, 23:20
Сообщение
#2
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Проблема совместимости некоторых скриптов заключается в путях к файлам и директориям.
Windows вообще говоря использует в путях как прямые (/), так и обратные слеши (\). Unix'ы в путях используют только прямые слеши (/). Отсюда возникает проблема совместимости скриптов на Windows и Unix системах. Предлагаю эту проблему совместимости решать следующим образом: В путях писать только прямые слеши: Например, для API 2: Код dofile(Core.GetPtokaXPath().."scripts/file.lua") Для API 1:Код dofile(frmHub:GetPtokaXLocation().."scripts/file.lua") (функции Core.GetPtokaXPath() и frmHub:GetPtokaXLocation() возвращают пути с прямыми слешами) При использовании той, или иной консольной команды (mkdir, rmdir и тд.) путь в параметре этой команды нужно заключать в двойные кавычки, тогда путь может содержать только прямые слешы, что как раз будет соответствовать предложенному принципу совместимости. Предлагаю разработчикам учесть этот факт и писать универсальные скрипты, совместимые с обеими системами windows и unix!!! Самый универсальный, кроссплатформенный и кроссхабный метод определения абсолютных путей: Код sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$"
|
|
|
11.11.2008, 0:29
Сообщение
#3
|
|
Местная ТехПоддержка Группа: Администраторы Сообщений: 1 875 Регистрация: 18.7.2008 Из: Моск. Обл, г. королев, район Болшево Пользователь №: 221 Спасибо сказали: 220 раз |
грасиас
|
|
|
14.12.2008, 21:18
Сообщение
#4
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Я тут ещё раз проверил... Толи глики у меня какие-то, то ли не знаю...
Проверти кто-нибудь создаёт ли данный скрипт папку test folder и вложенную в неё папку test folder2 ??? Код function OnStartup() sPath = Core.GetPtokaXPath().."scripts/" os.execute("md \""..sPath.."test folder/test folder2\"") end function Main() sPath = frmHub:GetPtokaXLocation().."scripts/" os.execute("md \""..sPath.."test folder/test folder2\"") end У меня создаёт, хотя из моего топика выше у меня раньше не создавал... Если это так, то можно писать везде только прямые слеши! |
|
|
14.12.2008, 21:26
Сообщение
#5
|
|
Освоившийся участник Группа: Пользователи Сообщений: 307 Регистрация: 11.7.2008 Пользователь №: 173 Спасибо сказали: 31 раз |
API2 - Да.
API1 - Нет. upd. Cорри, API1 при запущенном хабе, тоже. |
|
|
14.12.2008, 21:34
Сообщение
#6
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Спасибо, поправил мой пост. Для совместимости с обеими системами и win и unix достаточно писать пути используя функции Core.GetPtokaXPath() для API 2 и frmHub:GetPtokaXLocation() для API 1, и во всех путях следует писать только прямые слеши.
Соответственно для создания папок в аргументе команды пишутся также прямые слеши)) В команде удаления папки или файла в системе windows писать нужно обратные слеши! |
|
|
16.2.2009, 21:05
Сообщение
#7
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Снова поднимаю эту тему. По словам одного из пользователя линукса и моего бота на линуксе некорректно работают некоторые функции, конкретно работы с файлами.
В приветственном соообщении каждая строчка текста разделяется пустой строчкой! Вот функции Код function ShowHalloMessage(tUser) Core.GetUserAllData(tUser) local sProfile = "" if CheckOwner(tUser) then sProfile = "Owner" else sProfile = tProfiles[tUser.iProfile][4] end local HalloText = loadtextfiles(sText.."hallo.txt"); HalloText = string.gsub(HalloText, "%[USER%]", tUser.sNick) HalloText = string.gsub(HalloText, "%[IP%]", tUser.sIP) HalloText = string.gsub(HalloText, "%[HUB%]", SetMan.GetString(0)) HalloText = string.gsub(HalloText, "%[BOTNAME%]", sBot) HalloText = string.gsub(HalloText, "%[USERA%]", Core.GetUsersCount()+1) HalloText = string.gsub(HalloText, "%[VERSION%]", "Ptokax "..Core.Version) HalloText = string.gsub(HalloText, "%[ACTUALPEAK%]", Core.GetActualUsersPeak()) HalloText = string.gsub(HalloText, "%[MAXPEAK%]", tStat.MaxUsers) HalloText = string.gsub(HalloText, "%[MAXSHARA%]", GetNormalShare(tStat.MaxShara)) HalloText = string.gsub(HalloText, "%[SHARKA%]", GetNormalShare(Core.GetCurrentSharedSize()+tUser.iShareSize)) HalloText = string.gsub(HalloText, "%[SHARE%]", GetNormalShare(tUser.iShareSize)) HalloText = string.gsub(HalloText, "%[MSGS%]", tUsers[tUser.sIP].Msg) HalloText = string.gsub(HalloText, "%[TIMES%]", GetNormalTime(tUsers[tUser.sIP].Time,1)) HalloText = string.gsub(HalloText, "%[ROLE%]", sProfile) HalloText = string.gsub(HalloText, "%[SHARARECORD%]", GetNormalShare(tStat.MaxShara)) HalloText = string.gsub(HalloText, "%[USERRECORD%]", tStat.MaxUsers) Core.SendToNick(tUser.sNick,HalloText) end Код function loadtextfiles(filename) local message = "" local f = io.open( filename, "r" ) if f then message=f:read("*all") message=string.gsub(message,"|","") message=string.gsub(message,"\n","\r\n") f:close() end return message end upd: проблема решилась удалением строки: Код message=string.gsub(message,"\n","\r\n")
|
|
|
16.2.2009, 23:44
Сообщение
#8
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Вообще говоря \r - это возврат каретки, \n - это перенос на следующую строку. Смысл заменять перенос строки на возврат каретки с переносом строки не ясен. Это же лишнее действие. Замена вертикальной черты тоже не совсем понятна, так как черту надо заменять на код этой черты.
Код function loadtextfiles(filename) local f,message = io.open(filename) if f then message=f:read"*a" message=message:gsub("|","&#*124;") f:flush() f:close() end return message end * между &# и 124; удалить! |
|
|
17.2.2009, 19:42
Сообщение
#9
|
|
AmxModx Scripter Группа: Пользователи Сообщений: 302 Регистрация: 2.12.2008 Из: Королев Пользователь №: 1 283 Спасибо сказали: 127 раз |
В Unix для разделения строк используется \n а в Windows \r\n, отсюда и лишние пустые строки
|
|
|
17.2.2009, 20:10
Сообщение
#10
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
в виндовсе возврат каретки вовсе необязательное действие, оно обязательно только в случае работы с окнами.
|
|
|
22.2.2009, 10:13
Сообщение
#11
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 3 Регистрация: 22.2.2009 Пользователь №: 2 310 Спасибо сказали: 0 раз |
Приветствую а как быть простому пользователю, который не разбирается в коде для определения совместим тот или иной плагин под Linux или нет? Пересматривать каждую строчку кода скриптов или ставить каждый плагин для проверки мягко говоря не очень удобный вариант. Может быть имеется список совместимых плагинов? Если его нету, то можно его создать совместными усилиями. Думаю многим это понадобится и избавит от необходимости уточнять этот вопрос в топике каждого плагина по отдельности.
|
|
|
22.2.2009, 10:16
Сообщение
#12
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
В начале темы ясно написано что различия только в путях, список чего ты хочешь создавать?!
|
|
|
22.2.2009, 10:20
Сообщение
#13
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 3 Регистрация: 22.2.2009 Пользователь №: 2 310 Спасибо сказали: 0 раз |
Цитата В начале темы ясно написано что различия только в путях, список чего ты хочешь создавать?! Как я понял из вышенаписанного, бывают случаи когда различие не только в путях. Список плагинов совместимых с *NIX системами из "коробки", в которые не надо лезть ручками и допиливать самому даже пускай такую мелочь, как пути. Цитата В Unix для разделения строк используется \n а в Windows \r\n, отсюда и лишние пустые строки
|
|
|
22.2.2009, 12:19
Сообщение
#14
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ну это уже зависит от разработчиков скриптов. Я приверженец написания универсальных, кросс платформенных скриптов. Однако некоторые скриптописатели принципиально не хотят писать универсальные скрипты, мотивируя это усложнением читаемости кода.
|
|
|
30.3.2009, 12:01
Сообщение
#15
|
|
Активный участник Группа: Пользователи Сообщений: 93 Регистрация: 4.1.2009 Пользователь №: 1 670 Спасибо сказали: 6 раз |
Единственное непонял исправлять слеши во всём скрипте и нужно ли переписывать всю базу. Скажем на примере гостевой книги покажи что нужно исправить плиз
Причина редактирования: Не надо постить такой огромный код!!! Прикрепляй файлом!!!
Прикрепленные файлы
|
|
|
30.3.2009, 12:38
Сообщение
#16
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
заменить надо следующие строчки:
Код path = Core.GetPtokaXPath().."scripts/dats" -- имя папки
gbfile=path.."/guestbook.dat" --имя файлв nfile=path.."/news.dat" -- директория для файла rfile=path.."/requests.dat" -- директория для файла os.execute("mkdir ".."\""..path.."\"") |
|
|
30.3.2009, 12:42
Сообщение
#17
|
|
Активный участник Группа: Пользователи Сообщений: 93 Регистрация: 4.1.2009 Пользователь №: 1 670 Спасибо сказали: 6 раз |
Спасибо огроменное 2 месяца не мог добиться ответа на этот вопрос на куче сайтов
Но все равно не помогло.... Тупо так же выдаёт в чат !addrequest hgjkg может и в базе нужно чего то менять? |
|
|
26.5.2009, 17:39
Сообщение
#18
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Свистопляска с кроссплатформенностью мультистрок.
Переводы строк для различных платформ: \r\n для DOS формата, \n - для UNIX формата, \r - для Mac формата. Для совместимости скриптов в UNIX и WINDOWS системах предлагается использовать перенос \n. Кроссплатформенной альтернативой является lua мультистрока: Код str = [[line 1 line 2]] Тёмной лошадкой является следующий метод перевода строки: Код str = "line1\
line2" |
|
|
3.6.2009, 12:43
Сообщение
#19
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Универсальный путь к запущеному скрипту:
Код sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$" Переменная sMainPath содержит этот самый путь, переменная sMainSlash содержит слеш, который используется системой для разделения директорий в путях. Данный lua код будет работать везде где есть lua язык, вне зависимости от типа ОС и типа хаба! Протестировано на следующих платформах:
Пример (подключение файлов): Код sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$" dofile(sMainPath..("myfolder1/myfolder2/myfile.lua"):gsub('/', sMainSlash)) Замена слеша сделана и расчёта приведения пути к виду с одинаковыми слешами - слешами, которые использует ОС. |
|
|
3.6.2009, 14:37
Сообщение
#20
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Универсальный путь к запущеному скрипту: Думаю, будет не лишним добавить, что если данный способ используется не в "корневом" скрипте, а в скрипте, подгруженном при помощи dofile(), то необходимо увеличить значение аргумента функции debug.getinfo().
Код sMainPath, sMainSlash = debug.getinfo(1).source:match"^@?(.+([/\\])).-$" |
|
|
Похожие темы
|
Сейчас: 22.11.2024, 20:13 |