LINUX.ORG.RU

Сим-сим, откройся

 , , , ,


0

1

Развивая темы предыдущих исследований-уроков начинающим от начинающих и опытных

пришла мысль такого следующего творческого задания:

Написать такую программу в файл, чтобы она этот файл и отобразила. То есть: показала саму себя в исходном виде (коде).

Ну и, как и прежде напоминаю: в приоритете ясность, понимаемость, наглядность, лёгкость восприятия. Это не гольф-кодинг и не соревнование на краткость! Но минимализм - получается как следствие, чтобы убрать лишнее в коде. Как говорится: чтобы «за деревьями увидеть лес».

Отступлю от своего предыдущего опыта и переключусь с классического Си на оболочку Борна:

#!/bin/bash
while read l; do echo $l; done < $0
# такая нехитрая программа

Трёхстрочник из:

  1. Ши-бенг сигнатура оболочки (в классике /bin/sh)
  2. Собственно интерпретируемый рабочий код - только из встроенных (builtin) команд bash: while..do..done, read, echo. Т.е. никаких внешних программ не просим. Получается цикл, где в условии одновременно с проверкой на возможность чтения из потока - в переменную l загоняется очередная строка этого самого потока. А он в свою очередь является переадресованным (<) вводом из самого файла со скриптом ($0). В теле цикла echo итеративно выводит на экран значение ($) переменной l.
  3. финальный, не исполняемый комментарий тоже начинается с решётки, но будет показан нашим конкретным скриптом при запуске («самопрезентации»).

Ставим права и запускаем наш скрипт в файле selfie.sh:

chmod u+x selfie.sh
./selfie.sh

P.S.

Если меня не опередят: планирую написать нечто аналогичное на Си (как и в прошлый раз). Отображать и исходник, и бинарник. Но показывать читаемые символы (ASCII) исполнимого файла . То есть обложу себя условиями - никакого Unicode; исполнимый файл - с тем же именем, что и исходный, но без расширения (*.c).


Ответ на: Самофильтр от Android

Знаю, что народ захочет постить вызов утилиты strings на себя.

Не стоит проецировать на всех свою… гм, альтернативность.

anonymous
()
Ответ на: комментарий от anonymous

Вот если исходника неет, вот это уже челлендж уровня лор.

Ох уж этот уровень лор.

#include<stdio.h>
int main(){char n[]=R"(#include<stdio.h>
int main(){char n[]=R"(%s%c";printf(n,n,41);})";printf(n,n,41);}
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.