Ubuntu, скрипт и PureBasic
( Bash script & PureBasic )
При создании программ на PureBasic, в ОС Linux, иногда требуется применения shell скриптов в ходе выполнения этой программы. Можно поступить следующим образом:
[код purebasic] RunProgram("gnome-terminal","-x "+"bash -i -c "+Chr(34)+". script.sh; read"+Chr(34),GetPathPart(ProgramFilename()),
|
откроется окно терминала, где будет выполнен script.sh, т.е. наш запускаемый скрипт.
Все это очень хорошо, но надо будет таскать "паровозом" со своей программой и этот скрипт, если программа большая и содержит еще кучку дополнительных внешних файлов, то с этим можно смирится, а если наша программка легковесная и представляет из себя только один запускающий файл, то прицеплять к ней еще и скрипт было бы не эстетично :)
Как решение,при необходимости, можно прописать скрипт в тело программы на PureBasic, которая при запуске будет его генерировать и запускать в терминале:
[код purebasic] P.s=GetPathPart(ProgramFilename()) script.s = GetPathPart(P) + "script.sh" OpenFile(File_0, P+"script.sh") FileSeek(File_0, Lof(0)) WriteStringN(File_0, "#!/bin/bash") WriteStringN(File_0, "echo "+Chr(34)+"Hello World"+Chr(34)) CloseFile(File_0) RunProgram("gnome-terminal","-x "+"bash -i -c "+Chr(34)+". script.sh; read"+Chr(34),GetPathPart(P))
|
Показанный код, при запуске, генерирует (создает) файл script.sh и прописывает в нем:
#!/bin/bash echo "Hello World"
|
и далее запускает этот скрипт из терминала.
Конечно, скрипт из одной строки отображающий "Hello World" прописывать было бы не обязательно, можно обойтись и одной командой, хотя бы так:
[код purebasic] RunProgram("gnome-terminal","-x "+"bash -i -c "+Chr(34)+"echo "+"Hello World"+"; read"+Chr(34),GetPathPart(ProgramFilename()))
|
просто это как пример, ну Вы понимаете :)
Еще один способ записи bash скрипта в исполняемый файл на PureBasic
P.s=GetPathPart(ProgramFilename()) ; директория запуска программы Text.s=PeekS(?Im1, ?Im2-?Im1, #PB_UTF8) ; выделение памяти/загружаем текст из памяти, ?Im2-?Im1 размер памяти в байтах, занимаемый файлом Count=CountString(Text,#LF$) ; подсчет строк в скрипте (можно и без этой строки, сразу вписать кол. строк Вашего скрипта в цикл)
OpenFile(File_0, P+"tmp.sh") ; образуем временной файл temp.sh For i=1 To Count WriteStringN(File_0, StringField(Text,i,#LF$)) ; запись временного скрипта tmp.sh Next i WriteStringN(File_0, "rm -rf tmp.sh") ; !!! строчка для "самоликвидации" tmp.sh CloseFile(File_0) RunProgram("gnome-terminal","-x "+"bash -i -c "+Chr(34)+". tmp.sh; read"+Chr(34), GetPathPart(P)) ; исполнение скрипта в терминале Delay(100) ; небольшая временная задержка (для надежности/можно исключить) End
DataSection Im1: IncludeBinary "Text.sh" ;в исполняемый файл записывается файл/скрипт с именем Text.sh находящийся в одной папке с исходным текстом Im2: EndDataSection
|
При компиляции, Ваш bash скрипт Text.sh, который должен находиться в одной папке с исходным текстом компилируемой программы, будет "вшит" в исполняемый файл. В дальнейшем, при работе исполняемого файла Вашей программы будет образовываться временной Bash скрипт tmp.sh, который и будет исполняться в терминале.