[116473]Добро пожаловать на Темную Сторону, г-н Джаниква ;-).[12167]Ответы на ваши вопросы один за другим:[12168]. /configure[12169]То, что люди называют "командами" в Linux или UNIX - это обычно два вида вещей:[12170]либо конструкция [117035]shell[117036] (a [117037]builtin[117038], функция [117039]shell[117040], [117041]alias[117042]),[117043].
и всё такое [12171] или [117044] исполняемый[117045] файл[12172] Чтобы предоставить вам некоторый контекст здесь, то, что люди называют [116860]shell[116861], обычно является программой, чья задача состоит в том, чтобы принять некоторый ввод, а затем попытаться интерпретировать этот ввод, и после этого действовать соответственно (выполнить его, если это исполняемый файл, и т.д.). [12173] Когда вы вводите некоторый текст в оболочку, а затем нажимаете enter, примерно следующее происходит: [12174] Оболочка принимает входные данные, создавая лексические маркеры, соответствующие вводимым данным. Например, учтите, что вы вводите [117046]gcc hello_world.c[117047] в оболочку. В результате появятся следующие лексемы [117048]gcc[117049] и [117050]hello_world.c[12175]После токенирования, оболочка попытается понять, что такое первая лексемена (в нашем случае [117052]gcc[117053]). Сначала он увидит, является ли это [117054]shell конструкцией[117055] (функция, псевдоним или сборка) или это [117056]абсолютный путь[117057] (местоположение относительно каталога [117058]root[117059]) к исполняемому файлу (что-то вроде [117060]/usr/bin/gcc[117061])[12176], если это ни то, ни другое из вышеперечисленного, оболочка начнет поиск каталогов, перечисленных в переменной окружения [117062]PATH[117063], чтобы посмотреть, может ли она найти файл с таким же именем. Если находит, то обычно выполняется [4], а остальные лексемы передаются в качестве аргументов. Если нет, то обычно выводится сообщение об ошибке вида this[5]:[116869].
[116488]
[116489] [116870] [23:25:59] nlightnfotis@mars : [~] $ lelos
bash: lelos: команда не найдена...[12178]Теперь вы, как пользователь, обычно работаете в определенном дереве каталогов в файловой системе, известном как папка вашего пользователя [116872]home[116873], обычно обозначаемом как [116874]~[116875]. Обычно Вы, как пользователь, на самом деле пишете программу или скрипт оболочки (последовательность команд оболочки, которые обрабатываются не интерактивно). [12179] Теперь, предполагая, что Вы напишете программу на языке c и скомпилируете ее в исполняемом файле [116876]hello[116877], у Вас есть два способа ее выполнения. Первый - переместить или скопировать ее в каталог, который находится в [116878]$PATH[116879] (или добавить текущую папку в [116880]$PATH[116881], но из соображений безопасности это плохая идея) [116882] или [116883], выполняя ее прямо из той папки, которой Вы являетесь. Для последнего вы используете [116884]dot slash[116885] (./), чтобы предшествовать командам, которые вы хотите, чтобы оболочка выполняла, и искать их в папке, в которой вы в данный момент находитесь. [12180]nano /something/something2
[12181] Это что-то2 в файле? Похоже на каталог, я не...
понимаешь, как это можно редактировать? То же самое с ./configure. Что это такое
означает?[12182]В мире UNIX универсальная абстракция над всем - это абстракция файла. Это означает, что все (или почти все, что имеет значение), даже если это изображение, текстовый файл или даже устройство, обычно может быть [116890]read()[116891] или [116892]write()[116893] любой программой, которая этого хочет. Что касается операционной системы, это может быть что угодно, но для приложения, работающего в пользовательском пространстве, оно будет представлено в виде последовательности байт, которая зависит от того, как приложение будет представлять или манипулировать.[12183]Хороший первый способ понять, что такое что-то, это использовать команду [116894]ls[116895], используя флаг [116896]-l[116897] тоже. Это даст результат, аналогичный этому:[12184]В результате вы получите несколько столбцов, первый из которых соответствует разрезам, Вторая - количество жёстких ссылок, третья - владелец файла, четвёртая - группа файлов, следующая - размер файла, за ней следует время модификации и последнее, но не менее важное, имя файла.[12185]Чтобы легко понять, является ли что-то каталогом, вы заметите в его разрешениях первую букву, которая будет [116898]d[116899]. Это сигнализирует о том, что объект является каталогом.[12186]Если вы все еще видите файл и не уверены в его природе, вы можете воспользоваться утилитой userspace, называемой [116900]file[116901], которая пытается классифицировать файл по тому, что известно как его [116902]магическое число[116903], обычно некоторые байты хранятся в начале или рядом с ним. Например, запуск [116904]файла[116905] на этом bzip2 файле приводит к:[12187]Для текстового файла вывод аналогичен:[12188]Не стесняйтесь экспериментировать с файлом [116906]и разными типами файлов.[12189]Теперь, чтобы ответить конкретно на ваш [12190]вопрос, я не понимаю, как его можно редактировать?[12191]вопрос, ответ очень прост. Как я уже упоминал ранее, все представляет собой последовательность байт. Вы просто меняете эти байты. [12192]Если это текстовый файл, вы открываете его с помощью текстового редактора, меняете букву, а затем сохраняете. Это соответствует тому, что ваш текстовый редактор находит смещение в файле, в котором находится этот символ, и меняет его байты на байты, которые представляют новый символ.[12193]Что касается двоичных (т.е. не текстовых) файлов, то ответ на этот вопрос довольно прост:
Опять-таки вы используете какую-то программу, либо часть программы, разработанную специально для работы с таким типом файлов, либо вы просто используете шестнадцатеричный редактор (или просто обычный текстовый редактор) для его редактирования. Например, вы можете использовать [116910]vim[116911], текстовый редактор, чтобы редактировать двоичный файл, такой как [116912]python[116913], как этот: [116914]vim /usr/bin/python[116915]. В результате получится экран, подобный этому:[12194]Много странных символов в нем, это всего лишь простые байты, которым не хватает репрезентабельного символа в ASCII. Для входа в шестнадцатеричный вид в vim, просто введите, находясь внутри него [116917]:%!xxd[116918]. Вам покажут экран вроде этого:[12195]Затем перейдите к редактированию файла, сохраните ([116920]:wq[116921]), а затем выйдите из шестнадцатиричного вида, набрав [116922]:%!xxd -r[116923]. [116924]Просто будьте осторожны, чтобы не выбросить важный бинарный файл во время экспериментов, или проводите эксперименты внутри виртуальной машины, и все будет хорошо.[12196]Другой полезный инструмент, который вы можете использовать для [116926]просмотра[116927] байтов любого файла - это [116928]hexdump[116929]. На самом деле, попробуйте создать пустые файлы или файлы всего с несколькими символами, [116930]hexdump -C[116931] их, и посмотрите на вывод и ASCII таблицу на минуту просветления : )[12197]Если вы хотите увидеть (ассемблерный) код, соответствующий этим байтам (когда мы говорим об исполняемом файле), вы можете также использовать другой инструмент, названный [116932]objdump[116933] для их изучения, также как и [116934]objdump -d /usr/bin/python[116935]. На моем экране он производит так:[12198]Надеюсь, все это было полезно, и может быть исходный текст с вами :)[12199]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[12200]Сноски:[12201]Специфические механизмы, лежащие в основе двух вызовов системы UNIX, известные как [116941]fork()[116942] и [116943]exec()[116944]. В коде оболочка [116945]fork()[116946] сама по себе создает дочерний процесс, который затем продолжает вызывать [116947]exec()[116948] с первым маркером в качестве первого аргумента, чтобы заменить его основной образ (код) на двоичный, на который он ссылается [116949]exec()[116950]. [12202]Рабочий код для этого выглядит следующим образом (выгружен немного вниз, чтобы быть как можно более простым):[12203]Хорошо, все объяснение оболочки было немного упрощенным, так как есть больше вещей, которые делает оболочка, например, парсинг, потому что команда, данная ей, может быть больше, чем простой исполняемый файл с некоторыми аргументами, и включать перенаправления вывода, труб и т.д., которые следуют специальным курсам действий, но все же общее описание того, что делает оболочка, является довольно точным. Для небольшой и работающей оболочки посмотрите реализацию оболочки [116951]xv6[12204]
27.01.2020, 20:20
Ссылка