Может быть, самый простой способ — это использовать конвейер к сценарию/бинарному файлу, который будет выполнять произвольные преобразования:
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
.
Есть стандартные утилиты 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.)
В оболочке можно использовать встроенный -в :
. Это не исполняемый файл, но в сценарии оболочки или во всем, что выполняется из сценария оболочки, он подойдет :
$ 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
Предложение @ilkkachu использовать команду true
, вероятно, является лучшим ответом, но вы также можете использовать команду
sleep 0
Существует несколько ничего не делающих решений в оболочке. В частности :
, POSIX требует нулевой утилиты .
Но вы также требуете, чтобы это был внешний файл .
Итак, :стандарт POSIX определяет фиктивные исполняемые файлы, которые ничего не делают, может быть:
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.
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
также могут быть подходящими.
Мой ответ относится к более общему случаю, когда ничто может означать несколько вещей. Когда это означает:
sleep 100000d
должно работать пару столетий SIGKILL
)