Проблемы распространения ↑
Настройка проекта Python может быть неприятной, особенно для не разработчиков. Часто установка начинается с открытия Терминала, который не запускается для огромной группы потенциальных пользователей. Это препятствие останавливает пользователей еще до того, как руководство по установке углубится в сложные детали виртуальных сред, версий Python и т.д. и множество потенциальных зависимостей.
Вспомните, через что вы обычно проходите, настраивая новую машину для разработки Python. Вероятно, это выглядит примерно так:
- Загрузите и установите нужную версию Python;
- Настроить менеджер зависимостей;
- Настроить виртуальную среду;
- Получить копию своего кода;
- Установить зависимости.
Остановитесь на мгновение и подумайте, есть ли смысл в любом из вышеперечисленных шагов, если вы не разработчик, не говоря уже о разработчике Python. Возможно нет.
Эти проблемы взорвутся, если вашему пользователю посчастливится добраться до части установки, связанной с зависимостями. Это стало намного лучше за последние несколько лет с преобладанием колес, но для некоторых зависимостей по-прежнему требуются компиляторы C/C++ или даже FORTRAN!
Этот барьер для входа слишком высок, если ваша цель — сделать приложение доступным как можно большему количеству пользователей. Как часто говорит Раймонд Хеттингер в своих замечательных выступлениях:
Подключение отладчика
В Linux SOS с LLDB — это единственный отладчик, который может подключаться к автономным процессам с одним файлом или выполнять отладку аварийных дампов.
В Windows и Mac для отладки аварийных дампов можно использовать Visual Studio и VS Code. Для подключения к исполняемому файлу выполняемого автономного приложения с одним файлом требуется дополнительный файл: mscordbi.{dll,so} .
При отсутствии этого файла Visual Studio может выдать сообщение об ошибке, информирующее о том, что не удается присоединиться к процессу, так как установлен компонент отладки. VS Code выдать сообщение об ошибке, информирующее о том, что не удается присоединиться к процессу из-за неизвестной ошибки 0x80131c3c.
Чтобы устранить эти ошибки, нужно скопировать mscordbi и вставить рядом с исполняемым файлом. По умолчанию файл mscordbi обработан с помощью в подкаталоге с идентификатором среды выполнения приложения. Например, если бы нужно было опубликовать исполняемый файл автономного приложения с одним файлом, используя CLI для Windows и параметры , файл следовало бы поместить в папку bin/Debug/net5.0/win-x64/publish. Копия mscordbi.dll будет находиться в папке bin/debug/NET 5.0/Win-x64.
Колонка TYPE
В столбце TYPE может отображаться более 70 записей. Далее перечислены только некоторые из часто встречающихся записей:
- REG: Обычный файл файловой системы.
- DIR: Директория.
- FIFO: Специальный файл FIFO (First In First Out).
- CHR: Специальный символьный файл.
- BLK: Специальный блочный файл.
- INET: Интернет-сокет.
- unix: Доменный сокет UNIX.
- IPv4: IPv4 сокет.
- IPv6: Файлы IPv6 сети — даже если её адрес IPv4 преобразован в IPv6 адрес.
- sock: Сокет неизвестного домена.
- DEL: Указатель Linux для удалённого файла.
- LINK: Файл символьной ссылки.
- PIPE: Труба (pipe) — способ обмена данными между процессами.
Добавление файлов с данными, которые будут использоваться exe-файлом
Есть CSV-файл netflix_titles.csv, и Python-script, который считывает количество записей в нем. Теперь нужно добавить этот файл в бандл с исполняемым файлом. Файл Python-скрипта назовем просто simple1.py.
Копировать
Создадим исполняемый файл с данными в папке.
Параметр позволяет добавить файлы с данными, которые нужно сохранить в одном бандле с исполняемым файлом. Этот параметр можно применить много раз.
Синтаксис add-data:
- add-data <source;destination> — Windows.
- add-data <source:destination> — Linux.
Можно увидеть, что файл теперь добавляется в папку DIST вместе с исполняемым файлом.
Также, открыв spec-файл, можно увидеть раздел datas, в котором указывается, что файл netflix_titles.csv копируется в текущую директорию.
Запустим файл simple1.exe, появится консоль с выводом: .
Команда file — мгновенное определение типа любого файла
В Linux есть команда file с огромной базой сигнатур, которая очень быстро определяет тип файла:
Чтобы узнать, что за файл без расширения, выполните команду вида:
file /ПУТЬ/ДО/ФАЙЛА
Например:
file file1
Вывод:
file1: Microsoft Word 2007+
То есть это текстовый файл офисного пакета Microsoft Office.
Можно указать сразу несколько файлов для проверки или использовать подстановочные символы. Например, следующая команда проверит типы всех файлов в текущей папке:
file *
У программы file имеются опции, подробности о них смотрите в отдельной статье «Инструкция по использованию команды file».
Исследование системы
Образы
За что мне нравится исследовать образы – это очень удобно. По целому ряду причин:
- Мы можем повторить исследование неоднократно без опаски исказить или испортить, если монтировать образ к системе в режиме “только чтение”.
- Можем передать образ другому лицу (как Серёга передал мне), с жёстким диском было бы сложнее.
- Многие программы позволяют работать непосредственно с образом. Если нет – монтируем и получаем “виртуальный жёсткий диск”.
- Жёсткий диск может получить бэд-блок в нужном нам месте или вообще выйти из строя, образ лишён этого недостатка (не рассматриваем случай, когда вылетит сектор нашего жёсткого диска, на котором лежит образ – можно сделать копию образа на съёмный диск).
Поиск удалённой информации
Наиболее полная картина будет, когда мы откроем содержимое диска не через проводник Windows, а программами, использующими свой драйвер файловой системы – WinHEX, R-Studio – это позволит обходить права доступа к каталогам, получать удалённые файлы да и вообще сделает работу намного удобнее.
В разных случаях я использую различные программы, но R-Studio как правило всегда.
“Горячие точки”
Даже если на первый взгляд ничего необычного нет, (хотя у нас уже не всё ладно), поиск следов начинаем с экспресс-проверки “горячих точек” – мест, где наиболее вероятно появление различного рода вредоносного ПО:
- Корень раздела;
- Каталог Windows, Windows\System32, Program Files;
- Каталоги Temp (в корне раздела, в каталоге Windows, в каталоге AppData пользователя);
- Сам каталог AppData разных пользователей;
- Каталог запланированных задач (Tasks), их два, если что;
- Каталоги автозагрузки пользователей;
Если система была заражена, то 99% в одном из этих мест будет что-нибудь необычное и нехорошее, заметное даже при беглом взгляде. Все следы тщательно документируем и смотрим метки времени, особенно даты создания файлов. По этим датам ищем уже в других каталогах, R-Studio позволяет это сделать. Ну а потом начинаем “разматывать” в обе стороны – ранее и позднее от времени маркера, ищем так сказать причины и последствия :). И смотреть, что интересное есть в тех же каталогах.
Что такое Wine для Линукс
Wine представляет собой специализированное программное обеспечение, которое позволяет выполнять запуск классический приложений для Виндовс (с расширением *.exe) в среде любого дистрибутива Линукс. Об этом приложении слышали многие пользователи Unix-подобных систем и в некоторой степени оно помогло сэкономить их кучу времени.
Сразу же стоит сказать, что на некоторых дистрибутивах Линукс этот программный продукт установлен «из коробки» (предустановлен и входит в набор стандартных программ), поэтому в них уже можно пытаться запускать EXE-файлы и ошибки операционная система не выдаст.
Для того чтобы узнать, установлено ли приложение в конкретный дистрибутив и какой оно версии, необходимо перейти в консоль и прописать там команду «winecfg». Если окно открылось, то программа установлена. Для просмотра ее версии переходят в раздел «О программе».
Первый запуск и настройка программы Wine
Немаловажный вопрос заключается в том, где и как взять новую версию программного продукта. Если говорить проще, то существует три версии Wine: Stable – стабильная версия без вылетов и багов, которая устанавливается в большинстве случаев, Beta – бета-релиз, являющийся тестовым, и Development Release – особая версия для разработчиков программного обеспечения. Сравнительно недавно была произведена оптимизация всех модулей программы, поэтому можно смело устанавливать любую версию, начиная с 1.6.2.
Запуск исполняемых файлов в Windows 10
Ничто не мешает вам создавать собственное программное обеспечение, особенно если вы объедините его с пакетами установщика Windows, чтобы упростить установку. Однако для большинства пользователей Windows 10 файлы EXE нужно запускать, а не создавать. Пока вы запускаете программное обеспечение только из источников, которым доверяете, исполняемые файлы должны быть относительно безопасными.
Убедитесь, что вы регулярно выполняете сканирование на наличие вредоносных программ, и, если вы действительно не уверены в том, безопасно ли запускать исполняемый файл, вы можете использовать режим песочницы Windows 10 для запуска программного обеспечения в изолированном контейнере, чтобы проверить его. Если EXE опасен, он не повредит вашу основную установку Windows.
Добавление файлов с данными и параметр onefile
Если задать параметр , то PyInstaller распаковывает все файлы в папку TEMP, выполняет скрипт и удаляет TEMP. Если вместе с add-data указать onefile, то нужно считать данные из папки. Путь папки меняется и похож на «_MEIxxxxxx-folder».
Копировать
Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.
После успешного создания файл simple1.exe появится в папке DIST.
Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.
Дополнительные импорты с помощью Hidden Imports
Исполняемому файлу требуются все импорты, которые нужны Python-скрипту. Иногда PyInstaller может пропустить динамические импорты или импорты второго уровня, возвращая ошибку …
Для решения этой ошибки нужно передать название недостающей библиотеки в hidden-import.
Например, чтобы добавить библиотеку os, нужно написать вот так:
Названия файлов и папок
Я уже упоминал, что в Linux все имена файлов являются регистрозависимыми, то есть вы спокойно можете создать в одном каталоге два файла с одинаковыми именами, но записанными в различных регистрах, например, Ubuntu.txt и ubuntu.txt.
Кроме того, я так же говорил, что вы можете использовать в именах файлов абсолютно любые символы, которые пожелаете, кроме прямого слеша , однако в силу некоторых причин я бы не рекомендовал использовать следующие символы: , а также символы переноса строки и табуляции. Вы можете подписывать свои файлы китайскими иероглифами, рунами, греческими буквами и вообще чем угодно, если вам конечно будет удобно использовать такие имена.
Ну и напоследок ещё раз напомню, что разделителем каталогов в пути к файлу в Linux всегда является символ , в отличие от Windows, в которой используется .
Копаемся в артефактах PyInstaller ↑
PyInstaller сложен внутри и при работе создаёт массу информации
Итак, важно знать, на чем сосредоточиться в первую очередь. А именно исполняемый файл, который вы можете распространять среди пользователей, и потенциальную отладочную информацию
По умолчанию команда pyinstaller создает несколько интересных моментов:
- Файл спецификации *.spec
- Папка сборки Build
- Папка дистрибутива Dist
Файл спецификаций
По умолчанию файл спецификации будет назван в честь вашего сценария командной строки. Продолжая наш предыдущий пример, вы увидите файл с именем cli.spec. Вот как выглядит файл спецификации по умолчанию после запуска PyInstaller в файле cli.py:
# -*- mode: python -*- block_cipher = None a = Analysis(, pathex=['/Users/realpython/pyinstaller/reader'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='cli', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='cli')
Этот файл будет автоматически создан командой pyinstaller. У вашей версии будут разные пути, но большинство должно быть одинаковым.
Не волнуйтесь, вам не нужно понимать приведенный выше код, чтобы эффективно использовать PyInstaller!
Этот файл можно изменить и повторно использовать для создания исполняемых файлов позже. Вы можете сделать будущие сборки немного быстрее, предоставив этот файл спецификации вместо сценария точки входа для команды pyinstaller.
Есть несколько конкретных вариантов . Однако для простых проектов вам не нужно беспокоиться об этих деталях, если вы не хотите сильно настраивать способ сборки вашего проекта.
Папка сборки Build
Папка build — это то место, куда PyInstaller помещает большую часть метаданных и внутренней бухгалтерии для создания вашего исполняемого файла. Содержимое по умолчанию будет выглядеть примерно так:
| └── cli/ ├── Analysis-00.toc ├── base_library.zip ├── COLLECT-00.toc ├── EXE-00.toc ├── PKG-00.pkg ├── PKG-00.toc ├── PYZ-00.pyz ├── PYZ-00.toc ├── warn-cli.txt └── xref-cli.html
Папка сборки может быть полезна для отладки, но, если у вас нет проблем, эту папку можно в значительной степени игнорировать. Вы узнаете больше об отладке позже в этом уроке.
Папка Dist
После сборки вы получите папку dist, подобную следующей:
dist/ | └── cli/ └── cli
Папка dist содержит последний вариант приложения, который вы хотите отправить своим пользователям. Внутри папки dist есть папка, названная в честь вашей точки входа. Итак, в этом примере у вас будет папка dist/cli, содержащая все зависимости и исполняемый файл для нашего приложения. Исполняемый файл для запуска — dist/cli/cli или dist/cli/cli.exe, если вы работаете в Windows.
Вы также найдете множество файлов с расширениями .so, .pyd и .dll в зависимости от вашей операционной системы. Это общие библиотеки, которые представляют зависимости вашего проекта, которые PyInstaller создал и собрал.
Вы захотите распространить всю папку dist/cli, но вы можете переименовать cli во все, что вам подходит.
На этом этапе вы можете попробовать запустить исполняемый файл dist/cli/cli.exe, если вы следуете примеру программы чтения каналов.
Вы заметите, что запуск исполняемого файла приводит к ошибкам, в которых упоминается файл version.txt. Это связано с тем, что программе чтения каналов и ее зависимостям требуются некоторые дополнительные файлы данных, о которых PyInstaller не знает. Чтобы исправить это, вам нужно сообщить PyInstaller, что требуется version.txt, о чем вы узнаете при тестировании нового исполняемого файла.
Быстрый метод: использование 7-Zip
Вы, вероятно, уже используете 7-Zip для извлечения всех видов архивных файлов. извлечь , и вы, вероятно, уже знаете, что 7-Zip может создавать архивные файлы, но знаете ли вы, что вы также можете использовать его для создания EXE-файла, который действует как установщик?
Он называется SFX-архивом («самораспаковывающийся») и работает, сжимая все ваши конечные файлы вместе, а затем встраивая в архив специальный EXE-файл, который знает, как извлечь все. Другими словами, получатель может извлечь архив SFX (который выглядит как сам файл EXE), даже если у него нет подходящего программного обеспечения, что может случиться с такими форматами, как 7Z, RAR, TAR и ZIP.
Как создать свой собственный SFX-архив с 7-Zip:
- Подготовьте все свои файлы и каталоги в пределах одного основного каталога и назовите каталог как хотите.
- Щелкните правой кнопкой мыши каталог и выберите 7-Zip> Добавить в архив …
- В разделе « Параметры» включите « Создать архив SFX» и выберите следующие параметры… > Формат архива: 7z > Уровень сжатия: Нормальный > Метод сжатия: LZMA2 > Размер словаря: 16 МБ > Размер слова: 32 > Размер блока: 2 ГБ
- Нажмите ОК . Выполнено!
Обратите внимание, что SFX-архивы не являются настоящими установочными файлами. Они не помещают извлеченные файлы в назначенный целевой каталог
Они не изменяют реестр Windows. Они не создают журналы установки и не отображаются как «установленное программное обеспечение» в приложении удаления. Это буквально архивные файлы, наряженные в EXE-файлы.
Загрузить — 7-Zip (бесплатно)
Исполняемые файлы в Linux
В вопросах исполняемых файлов, то есть, когда по простому, обычных программ, Ubuntu кардинально отличается от Windows. В Windows исполняемые компданные имеют расширение exe (в основном), а внутри представляют из себя нечитаемый набор байтов. А в Ubuntu выполняемым может быть даже текстовый файл. Сразу скажу, что exe — это программы для Windows и в Ubuntu они не трудятся без Wine (приложения для запуска исполняемых файлов Windows в Linux), но вообще говоря и в Wine они трудятся далеко не всегда.
Итак, что же такое исполняемый файл с точки зрения Ubuntu? Практически это любой файл, который помечен, как исполняемый и который Ubuntu сможет запустить на исполнение. Означает это вот что: у каждого файла есть специальное свойство-переключатель, никак не зависящее ни от имени, ни от охватываемого, отвечающее за исполняемость. Если файл помечен, как исполняемый, то вообще говоря он таковым и представляется, а если не помечен — то это обычный файл с данными и напрямую запустить его на выполнение нельзя. Иное дело, что не любой файл, помеченный как исполняемый, Ubuntu сможет выполнить, хотя в запасе Ubuntu есть масса методов запуска файлов с совершенно различным содержимым.
Какие файлы не стоит открывать в редакторах ресурсов
- EXE более гигабайта величиной. В программе установлены ограничения – образ открываемого файла должен разместиться в пределах первого гигабайта памяти.
- Файлы, которые создавались в Visual Basic. Секция ресурсов таких файлов содержит только иконку и номер версии. Сам код на VB находится в специальном формате, который не откроется в редакторе ресурсов.
- Установщики других программ. В ресурсах хранятся только номер версии и иконка. Внутри таких файлов находится контейнер, который содержит другой, сжатый файл EXE, и программу-распаковщик. Кроме того, для сохранения данных в таких программах используются разные технологии.
- Самораспаковывающиеся архивы в виде exe-шников. Это просто архивированная информация и программа для ее распаковки.
В Linux всё является файлами
Часто цитируемая фраза о том, что всё в Linux является файлом, является своего рода правдой. Файл представляет собой набор байтов. Программы и устройства (принтер, экран, клавиатура, мышь, терминал, сетевая карта) могут генерировать или принимать потоки байт, и в этом качестве они сами проявляются как файлы. Многие системные компоненты, такие как клавиатуры, сокеты, принтеры и коммуникационные процессы, принимают или генерируют потоки байтов. Поскольку они принимают, генерируют или принимают и генерируют потоки байтов, эти устройства могут обрабатываться — на очень низком уровне — как файлы. Кроме обычных файлов, файлами также являются директории (папки), сетевые сокеты (подключения по сети), устройства (диски, терминалы, клавиатура, мышь и прочее — это всё файлы), pipe (технология обмена данными между процессами).
Эта концепция устройства упростила реализацию операционной системы Unix. Это означало, что небольшой набор обработчиков, инструментов и API-интерфейсов может быть создан для обработки широкого спектра различных ресурсов.
Файлы данных и программ, которые находятся на вашем жёстком диске, являются обычными файлами файловой системы. Мы можем использовать команду ls, чтобы вывести их и узнать некоторые детали о них. Но как мы узнаем обо всех других процессах и устройствах, которые рассматриваются как файлы? Для этого используется команда lsof. Она выводит списки открытых файлов в системе. То есть она перечисляет всё, что обрабатывается, как если бы это был файл.
Включение собственных библиотек
По умолчанию один файл не включает собственные библиотеки. В Linux предварительно связывается среда выполнения с пакетом, а в каталоге, в котором размещается приложение с одним файлом, развертываются только собственные библиотеки приложения. В Windows предварительно связывается только код размещения, а в каталоге, в котором размещается приложение с одним файлом, развертываются как библиотеки среды выполнения, так и собственные библиотеки приложения. Это позволяет обеспечить эффективную отладку, для которой требуется, чтобы собственные файлы были исключены из одного файла.
Начиная с .NET 6 среда выполнения включена в пакет на всех платформах.
Можно задать флаг , чтобы включить собственные библиотеки в один пакет, но эти файлы будут извлечены в каталог на клиентском компьютере при запуске приложения с одним файлом.
При указании будут извлечены все файлы (даже управляемые сборки) перед запуском исполняемого файла. Это позволяет сохранить исходное поведение развертывания одного файла в .NET Core.
Примечание
При извлечении файлы извлекаются на диск перед запуском приложения:
- Если для переменной среды задан путь, файлы будут извлечены в каталог по этому пути.
- В противном случае при запуске в Linux или MacOS файлы будут извлечены в каталог в .
- При запуске в Windows файлы будут извлечены в каталог в .
Чтобы предотвратить незаконное изменение, эти каталоги не должны быть доступны для записи для пользователей или служб с разными привилегиями (не /tmp или /var/tmp в большинстве систем Linux и macOS).
Примечание
В некоторых средах Linux (например, в systemd) извлечение по умолчанию не будет работать, так как не определено. В таких случаях рекомендуется явно задать значение .
Для systemd можно определить DOTNET_BUNDLE_EXTRACT_BASE_DIR в файле единицы службы как , который systemd корректно расширит до для учетной записи, запускающей службу.
Как определить тип данных, если у файла нет расширения
Если у файла нет расширения, то единственным вариантом определения его типа остаётся содержимое этого файла. Можно попробовать добавлять различные расширения к имени файла и пытаться открыть соответствующими для этого расширения программами — этот вариант медленные и неэффективный.
Определённые типы бинарных файлов могут иметь одинаковый набор байтов — по этим байтам можно сопоставить тип файлов. И именно данный метод и применяется программами, предназначенными для определения типа данных. Специфичные байты как правило располагаются не в самом начале файла, поэтому кроме самих байтов, нужно знать смещение от начала, где эти байты должны находиться. Некоторые программы в дополнении к байтам для идентификации ещё имеют список для проверки на ложное срабатывание.
Такие паттерны на английском часто называют magic — это пошло от «magic number» в исполнимых файлах. Эти файлы имеют «магическое число», хранящееся в определённом месте рядом с началом файла, которое сообщает операционной системе UNIX, что файл является двоичным исполняемым файлом и каким именно из нескольких типов. Концепция «магического числа» была применена к другим бинарным файлам. То есть файлы одинакового типа имеют одинаковую последовательность байтов в определённом месте от начала файлов.
Файл с сигнатурами, описывающими какие именно байты, на каком расстоянии от начала файла характерны для файлов того или иного типа, обычно называют magic file.
Чтобы понять количество проделанного труда при поиске уникальных байтов, обязательно присутствующих в тех или иных файлах, посмотрите на магический файл для определения файловых систем https://github.com/file/file/blob/master/magic/Magdir/filesystems
Это только один файл из перечня различных типов файлов: https://github.com/file/file/tree/master/magic/Magdir
Кроме магических чисел могут применяться и другие техники, например, программа file для проведения тестов файловых систем также может использовать системный вызов stat. Тип текстовых файлов определяется по содержащимся в них строкам (например, это может быть PHP код, файл в XML или HTML разметке, JSON и так далее).
Как установить флаг исполняемости в GUI
Установка файлов исполняемости доступна не только через терминал, но и файловые менеджеры, одним из которых является GUI. Для новичков, возможно, даже эта инструкция окажется проще и доступней. Рассмотрим на примере файлового менеджера GNOME, Nautilus. Кликните правой кнопкой по нашему файлу программы или скрипта, чтобы открыть контекстное меню, затем выберите свойства:
Переходим на вкладку права и устанавливаем галочку «Разрешить выполнение файла как программы»:
Теперь файл будет запущен системой непосредственно из файлового менеджера. Вот и вся инструкция. Теперь с запуском программы или скрипта из интернета у вас не возникнет трудностей.
Что такое исполняемость?
Уже много написано о том, как установить флаг исполняемости. Но что происходит с файлом во время этого, что такое исполянемость и как это работает?
Программа — это набор инструкций, которые по очереди выполняет процессор над данными, чтобы получить определенный результат. Но это вы, наверное, уже знаете.
На самом деле для процессора нет разницы между данными и инструкциями. И те и другие состоят из байт, проще говоря цифр. Когда-то договорились, что определенные сочетания цифр будут означать то или иное действие процессора, а во всем остальном это те же данные. Поэтому для процессора нет никакой разницы что выполнять — исполняемый файл linux или обычный текстовый файл. Оба могут быть успешно выполнены, вот только во втором варианте инструкции не имеют никакого смысла.
Чтобы система могла определить какие файлы нужно выполнять, а какие лучше не надо и был придуман флаг исполняемости. По сути, флаг исполяемости — это несколько байт в файловой системе, которые говорят нужно выполнять файл или нет, само содержимое файла никак не изменяется. Со скриптами все работает точно так же, только команды из файла выполняет не процессор, а интерпретатор, например, в bash скриптах — сама оболочка bash. Да и в обычных программ тоже есть свой загрузчик — это ld-linux.so.2.
EXE файл.
После компоновки у вас образуется.EXE файл вашей программы. Вы можете кинуть ее другу, и она откроется у него прямо в командной строке, как в старом добром DOS. Давайте попробуем создать.EXE файл. Все действия будут приводится в PascalABC.NET.
Заходим в Сервис -> Настройки -> Опции компиляции. Поверяем, стоит ли галочка напротив 2 пункта. Если стоит, то убираем ее.
Теперь откройте свою программу и запустите ее.
Откройте директорию, в которой у вас лежит исходный код программы.
Вот он,.EXE файл.
Кликаем по приложению. Как вы видите, после ввода данных, окошко сразу закрывается. Для того чтобы окно не закрывалось сразу, следует дописать две строчки кода, а именно: uses crt (перед разделом описания переменных) и readkey (в конце кода, перед оператором end).
Подключаем внешнюю библиотеку crt и используем встроенную в нее функцию readkey.
Теперь окно закроется по нажатию любой клавиши.
На заметку: PascalABC.NET — это интегрированная среда разработки.
Среда разработки включает в себя:
- текстовый редактор;
- компилятор;
- средства автоматизации сборки;
- отладчик.
Текстовые файлы
Текстовые файлы в Ubuntu повсюду. Все настройки хранятся в виде текстовых файлов, исходные коды всех программ представляют из себя текстовые файлы, многие программы в Ubuntu являются на самом деле скриптами, то есть тоже текстовыми файлами. И естественно Ubuntu умеет работать с текстовыми файлами как угодно. И этой темы даже не пришлось бы касаться, если бы не одна проблема операционных систем Windows. Дело в том, что в Windows до сих пор кое-где ещё используется устаревший в 90-х прошлого столетия способ сохранения обычного текста, в частности, в текстовых файлах.
На самом деле большинство файлов откроется в стандартном текстовом редакторе Ubuntu без проблем, но всё же иногда попадаются файлы, которые отображаются «кракозябрами». В этом случае необходимо немного помочь Gedit и указать кодировку файла вручную
Для этого закройте в редакторе вкладку с нечитаемым файлом, затем выберите в меню программы пункт «Открыть», найдите свой файл и обратите внимание на поле «Кодировка символов», находящееся внизу диалогового окна открытия. В этом поле необходимо указать нужную кодировку, после чего файл откроется уже в пригодном для чтения виде
Кстати, рекомендую такие файлы сразу сохранять в , дабы в дальнейшем не возникало с ними проблем.
Существуют и более лёгкие способы работы с кодировками, например, плагин для Gedit, позволяющий менять кодировку у открытых файлов без необходимости их переоткрывания. Кроме того, существуют утилиты для автоматического перекодирования файлов в , например, . Можно также управлять механизмом автоопределения кодировки в Gedit, это делается через редактор конфигурации, про который я немного расскажу в одной из последних статей.
Напоследок хочется сказать, что очень рекомендуется так или иначе перевести всю текстовую информацию на использование , поскольку фактически только эта кодировка нормально распознаётся везде и всегда, а в будущем скорее всего только она и будет использоваться.
Автоматическое обновление выводимой информации lsof
Чтобы перевести lsof в режим повтора, мы можем использовать опцию +r СЕКУНДЫ или её вариант -r СЕКУНДЫ. Опцию повторения можно применить двумя способами: +r или -r. Мы также должны добавить количество секунд, которое мы хотим, чтобы lsof ожидал перед обновлением дисплея.
Использование опции повтора в любом формате заставляет lsof отображать результаты как обычно, но добавляет пунктирную линию внизу экрана. Программа ожидает количество секунд, указанное в командной строке, а затем обновляет дисплей новым набором результатов.
С опцией -r это будет продолжаться пока вы не нажмете Ctrl+c. В формате +r программа будет продолжаться до тех пор, пока не будет получен пустой результат, или пока вы не нажмете Ctrl+c.
sudo lsof -u mial -c ssh -a -r5
Обратите внимание на пунктирную линию (=======) внизу списка. Она отделяет каждое новое отображение данных при обновлении вывода.