Существует ли стандартный фиктивный исполняемый файл, который ничего не делает в Linux?

Может быть, самый простой способ — это использовать конвейер к сценарию/бинарному файлу, который будет выполнять произвольные преобразования:

begin routers
pass2script:
  driver    = accept
  transport = myscript
  condition = ## every distinction you need ##  

И транспорт:

begin transports
myscript:
  driver  = pipe
  command = /path/to/script 

Все сообщение, включая заголовки, пустую строку и тело, будет передано в stdinскрипта/двоичного файла. Сценарий должен прочитать stdinи после продолжения выполнить команду sendmail -tдля повторной отправки преобразованного сообщения локально. Самый простой сценарий, о котором я думаю, это следующий:

#!/bin/sh

cat /dev/stdin \
| sed '1 s/somelist@example.com/somelist-bounces@example.com/' \
| sendmail -t

####

eximполучит измененное сообщение и обработает его как обычно. Вы должны убедиться, что не создаются циклы маршрутизации и сообщения не передаются сценарию и обратно снова и снова.

Также вы должны убедиться, что у пользователя eximдостаточно прав для запуска скрипта и, особенно, команды sendmail -t. Возможно, вам нужно правильно настроить правила sudo.

46
09.07.2020, 14:45
5 ответов

Есть стандартные утилиты trueи false. Первый ничего не делает, кроме возвращает статус выхода 0 для успешного выполнения , второй ничего не делает, но возвращает не -нулевое значение, указывающее на не -успешный результат(*). Вы, вероятно, хотите первый.

Хотя некоторые системы, которые действительно хотят, чтобы вы вводили какой-то текст (сообщения фиксации и т. д. )будут проверять, действительно ли был изменен «отредактированный» файл, и просто запуск trueв этом случае не сработает.. Вместо этого может работать touch; он обновляет временные метки всех файлов, которые он получает в качестве аргументов .

Однако, если редактор получит какие-либо другие аргументы, кроме имени файла, touchсоздаст их как файлы. Многие редакторы поддерживают такой аргумент, как +NNN, чтобы сообщить начальной строке, куда следует поместить курсор, и поэтому редактор может называться как $EDITOR +123 filename.txt. (. lessделает это, gitкажется, что нет.)


Обратите внимание, что вы захотите использовать true, а не, например,. /bin/true. Во-первых, если задействована оболочка, указание команды без пути позволит оболочке использовать встроенную реализацию, а если оболочка не используется, двоичный файл все равно будет найден в PATH. Во-вторых, не все системы имеют /bin/true; например. в macOS это /usr/bin/true. (Спасибо, @jpaugh.)

(*или, как сказано на справочной странице GNU , false "ничего не делает, безуспешно". Спасибо @8bittree.)

123
18.03.2021, 23:21

В оболочке можно использовать встроенный -в :. Это не исполняемый файл, но в сценарии оболочки или во всем, что выполняется из сценария оболочки, он подойдет :

.
$ help :
:: :
    Null command.
     
    No effect; the command does nothing.
     
    Exit Status:
    Always succeeds.

Это, возможно, наиболее известно благодаря использованию в операторе while (while :; do break; done), но не ограничивается таким использованием. Если вам нужно сделать это много раз, гораздо быстрее не запускать отдельный процесс:

$ time for i in $(seq 1000); do :; done

real    0m0,007s
user    0m0,002s
sys     0m0,004s
$ time for i in $(seq 1000); do /bin/true; done

real    0m0,686s
user    0m0,462s
sys     0m0,217s
27
18.03.2021, 23:21

Предложение @ilkkachu использовать команду true, вероятно, является лучшим ответом, но вы также можете использовать команду

sleep 0
4
18.03.2021, 23:21

Существует несколько ничего не делающих решений в оболочке. В частности :, POSIX требует нулевой утилиты .

Но вы также требуете, чтобы это был внешний файл .

Итак, :стандарт POSIX определяет фиктивные исполняемые файлы, которые ничего не делают, может быть:

  1. Утилиты, которые ничего не выводят и имеют статус завершения успех(0 )(, за исключением отмеченных)(в порядке значимости (IMO):
printf ''             # requires a format. The format may be empty.
test 1                # requires a non-empty string (or number).
[ 1 ]                 # equivalent to test.
true                  # requires no argument.
false                 # requires no argument (exit code IS 1 ).
rm -f ''              # DO NOT USE. requires a file name and will remove it.
sh -c ''              # may load init files into memory, not a clean solution.
                      # but it is almost unheard of that `sh` is missing.
                      # sh -c '' /path/to/file will not damage the file.
  1. Утилиты, которые также заканчиваются кодом выхода 0, но имеют некоторый вывод:
echo ''
date +''
expr ''

Могут быть и другие?. искать себя в списке исполняемых файлов

Но в вашем запросе также указывается (Если я вас правильно понял ), что вызываемый исполняемый файл совместим с:

> the actual invocation done by the build system is $EDITOR /path/to/file

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

Я не знаю точных деталей вашей системы сборки, но, вероятно,:

test /path/to/file

Учитывая, что для EDITORустановлено значение test, должно работать отлично (или true, или false ).

Если некоторые выходные данные не являются проблемой, (система сборки отбрасывает выходные данные EDITOR), тогда echoили printfтакже могут быть подходящими.

3
18.03.2021, 23:21

Мой ответ относится к более общему случаю, когда ничто может означать несколько вещей. Когда это означает:

  • Остановившись с «нормальным» кодом возврата, вы можете использовать предложения, упомянутые во всех других ответах
  • Остановка без кода возврата :Невозможна
  • Чтобы избежать кода возврата, просто никогда не останавливаясь, sleep 100000dдолжно работать пару столетий
  • Не обрабатывается при получении сигналов :Невозможно, некоторые сигналы не могут быть заблокированы (, например.SIGKILL)
    (Теоретически нечто подобное возможно при создании вилочной бомбы , но вы не этого хотите)
-1
10.04.2021, 22:23

Теги

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