Оболочке разрешают оптимизировать бесполезные команды завершения?

apt-get обновит до пакетов, доступных в репозитории из источника это apt настроен для использования.

postgresql-9.1 пакет является версией 9.1.4 в squeeze-backports репозиторий.

Добавьте следующее к /etc/apt/sources.list.d/backports.sources.list

deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free

Затем выполненный:

apt-get update && apt-get install postgresql-9.1

Если Вы будете Хрипящими, то 9.1 уже будет доступно. При выполнении выпуска до Сжатия затем, необходимо сначала интересоваться обновлением для Сжатия.

27
23.05.2017, 15:40
4 ответа

Нет, это плохая идея.

cat hugeregularfile.txt > /dev/null и touch -a hugeregularfile.txt не одно и то же. cat прочитает весь файл, даже если вы перенаправите вывод в /dev/null. А чтение всего файла может быть именно тем, что вам нужно. Например, для того, чтобы кэшировать его, чтобы последующие чтения были значительно быстрее. Оболочка не может знать о ваших намерениях.

Точно так же компилятор языка Си никогда не оптимизирует чтение файла, даже если вы не смотрите на то, что читаете.

26
27.01.2020, 19:39
[112140] При виде [112526]cat hugeregularfile.txt > /dev/null[112527], оболочка не позволяет поверить, что действие бесполезно - [112528]cat[112529] не является частью оболочки и может делать что угодно как в теории, так и на практике.
  • Например, пользователь мог переименовать исполняемый файл [112530]rm[112531] в [112532]cat[112533], и вдруг строка выполняет внешне наблюдаемое поведение, т.е, удаляя файл.
  • Пользователь мог скомпилировать версию [112534]cat[112535], которая идет в бесконечный цикл, таким образом, оболочка не может предполагать, что она "известна как завершающая", как вы предполагаете.

    Кто-то мог установить версию [112536]cat[112537], которая работает, как предполагалось, но с дополнительным побочным эффектом установки руткита, если он когда-либо запускался с адекватными привилегиями - опять же, оболочка должна корректно его выполнять.[112147].

    7
    27.01.2020, 19:39

    Он не оптимизирует выполняемые команды (и вы уже получили несколько хороших ответов, объясняющих, почему этого не следует делать), но он может оптимизировать вилки, пары труба / сокет, в некоторых случаях читает. Возможные варианты оптимизации:

    • В большинстве современных оболочек последняя команда в сценарии обычно будет выполняться в процессе оболочки, если не были установлены некоторые ловушки . Например, в sh -c ls большинство реализаций sh ( bash , mksh , ksh , ] zsh , yash , некоторые версии ash ) не будут форкнуть процесс для запуска ls .
    • в ksh93 , подстановка команды не будет создавать канал или разветвлять процесс до тех пор, пока не будет вызвана внешняя команда ( $ (echo foo) , например, будет расширяться до foo без пары патрубок / патрубок или вилки).
    • встроенная функция чтения некоторых оболочек ( bash , AT&T ksh ) не будет выполнять однобайтовые чтения, если они обнаруживают, что stdin доступен для поиска (в в этом случае они будут выполнять большие чтения и возвращаться к концу того, что они предназначены для чтения).
    14
    27.01.2020, 19:39

    Нет, поскольку / dev / null - это просто имя, которое можно использовать для любого другого устройства или файла, кроме что «обычно» является приемником данных.

    Таким образом, оболочка (или любая другая программа) не знает, основываясь на имени, делает ли файл , в который она пишет, что-то «по-настоящему» с данными. Есть AFAIK, также нет системных вызовов, которые программа оболочки может сделать, чтобы определить, например, дескриптор файла на самом деле ничего не делает.

    Ваше сравнение с оптимизацией удаленного кода в программе на C не работает, поскольку оболочка не имеет полного обзора, который есть у компилятора C для фрагмента исходного кода. Оболочка недостаточно знает о / dev / null , чтобы оптимизировать ваш пример, больше похоже на то, что компилятор C недостаточно знает о коде в вызове функции, на которую он динамически ссылается, чтобы не выполнять вызов .

    20
    27.01.2020, 19:39

    Теги

    Похожие вопросы