alogic: (Default)
alogic ([personal profile] alogic) wrote2010-03-28 02:44 am
Entry tags:

(no subject)

На линуксовке сегодня хоть и было человек 10, но зато 2 девушки. Ну и конкурс на знание shell оказался серьёзным. Рома придумал 20 на вид простых, примерно однострочных скриптов и надо было отгадать, что они напечатают. Чемпионом оказался админ с многолетним стажем [livejournal.com profile] sphynkx и то я не уверен, что у него хотя бы 13 правильных ответов:) Последнее задание просто восхитило своим философским смыслом. Какой логике следует shell?
if ! !false; then
     echo "Интуиционистская логика"
else
     echo "Классическая логика"
fi

[identity profile] andy-shev.livejournal.com 2010-03-28 09:51 am (UTC)(link)
!: Command not found
:-)

[identity profile] alogic.livejournal.com 2010-03-28 01:06 pm (UTC)(link)
На самом деле
!false: command not found

Однако ответ будет напечатан и скрипт завершится успешно. Потому что "!" не оператор, а ключевое слово. Ключевые слова шелл распознаёт, только если они стоят в правильном месте, поэтому, следуя завещанию интуиционистов, шелл не сделает отрицание отрицания. Он оставит только отрицание ошибочного результата выполнения неизвестной ему команды "!false".

[identity profile] andy-shev.livejournal.com 2010-03-28 02:39 pm (UTC)(link)
[root@localhost ~]# if \! \!false; then echo "o"; fi
bash: !: command not found

[identity profile] ro-che.info (from livejournal.com) 2010-03-28 02:45 pm (UTC)(link)
What's the point? :) Ключевое слово не распознаются как таковое, когда хотя бы часть его заквочена (используя кавычки или бекслеш).

[identity profile] andy-shev.livejournal.com 2010-03-28 02:48 pm (UTC)(link)
[root@localhost ~]# if ! !/bin/false; then echo "o"; fi
bash: !/bin/false: event not found

Зависит от места, в этом поинт. Если запускать из файла, то alogic прав.

[identity profile] ro-che.info (from livejournal.com) 2010-03-28 02:55 pm (UTC)(link)
Это чисто башевская фишка, которая к POSIX Shell не имеет никакого отношения.

[identity profile] alogic.livejournal.com 2010-03-28 05:01 pm (UTC)(link)
В командной строке ещё history expansion делается, где ! свой смысл имеет, поэтому для чистоты эксперимента надо ещё set +H в начале сказать.