Любые сообщения в файл/var/журнал/демон или лог-файл? @KateGregory я понимаю ограничения на практичность, но вариант был открыт для ФП. Я тоже бы ворчал по поводу неудобств и дополнительных расходов, но альтернативы скорее всего не на все рейсы и авиакомпании, утверждая, что обстоятельства вне их контроля `execplus` существует с 1989 года, `gfind`, похоже, проспал последние 20 лет развития ОС UNIX. @Мат Хм, спасибо. Это делает вопрос очень интересный. "еще один для Австрии": граждане Перу не требуется виза на въезд в Шенгенскую зону. Верно, но вы пригвоздили причина, по которой я не стал снимать неоднозначность этом случае экспертиза будет отменена по indirectness.

Честно говоря, я довольно уверен, что нет таких проблем, которые не решить путем делать что-то, кроме явного вызова внешнего двоичного (особенно ищу конкретную реализацию внешнего двоичного).

Так как я обычно ненавижу ответы, которые сводятся к "вам не стоит этого делать, что ты хочешь", я делаю исключение. Вместо этого я предлагаю множество альтернатив, для того, как сильно я предлагаю их. Если вы абсолютно должны найти правильный Эхо бинарных, Майкл Гомер был наиболее подходящий ответ, и вы должны прочесть Стефан Chazelas' ответ тоже, потому что она воспитывает нескольких местах в файловой системе, которые вы не могли ожидать, чтобы найти Эхо двоичные файлы. У меня также есть некоторые дополнительные предостережения о поиске "правильных" эхо в моем последнем разделе этого ответа.

е

Я никогда не видел системы, которая была предназначена для выполнения пользовательских скриптов и который видел реальной пользы в последние пару десятилетий, который не грузит с функции printf. Я, конечно, ни разу не видел систему, которая подошла даже близко, включая то, как большой, как GNU coreutils , которая не грузит С Е из коробки.

На перспективу, я помешана на точку это вредно с shell-скрипт, удобоносимость, и у меня есть доступ к буквально только двух систем С Борна-как раковина прямо сейчас, которые не имеют функции printf: виртуализированной ОС UNIX В7 (да, один из четыре десятилетия назад или около того), и один (из примерно пяти лет в моем распоряжении) Android устройства, которые в основном ничего не установлено и так закрыта она не будет запущена никаких полезных скриптов в ближайшее время в любом случае.

Это будет печатать строку в точности, о - обещаю, - каждая система, которая заслуживает того, чтобы быть использована любым человеком в современную эпоху:

с printf "%S " или "$my_var_holding_my_text"

и

функции printf '%s' в 'мой текст в одинарные кавычки: не\"t забудьте только '\" должен вырваться в одинарные кавычки строковые литералы'

Если вам также нужно распечатать нулевой байт. Я сомневаюсь, что вам нужно. Если вы делаете, вы не можете иметь весь текст как один аргумент функции printf в любом случае, так как большинство снарядов (ЗШ заслуживает похвалы) использование нулевых байтов в строку Терминаторов. Так что вы бы использовать \000 восьмеричные Escape в ваш формат строки (первый аргумент) и соединить его с нулем или более %ов и ноль или более аргументов для печати все другого текста. Наговор убегает (против восьмеричной) и другие приемы менее портативный, насколько я знаю.

Предложение: не ставьте ничего вам не нужно специально проанализирован/преобразованы в формат строки. Различные функции printf поддержка реализации немного отличается форматированием (в том числе современные функции printf реализации, например, Баш встроенные против busybox в функции printf).

Если вы хотите дополнительный символ новой строки добавляется в ваш выходной, дополнительный - это тривиально, чтобы добавить в свой формат строки:

функции printf '%з\п' фу

является строго однозначной/работ--то же-везде эквивалент

Эхо ФОО

Если вы получаете некоторые запутанные ситуации, где это не так просто как построить строку формата, который вам нужен (помните, что вы можете построить строку формата программно, используя переменные тоже), вы всегда можете включить строку литерал на аргументы вы передаете в функции printf, или выводить символы новой строки сами с голой Эхо без аргументов отдельно.

Здесь-файлы, или: кошка <<разделитель

кошка <<разделитель
$my_variable_containing_my_text
Разделитель

или

кошка <<разделитель
мой текст так долго, как это не включать линию, начиная с разделителем
потому что это будет использоваться в качестве конечного файла для файла.
$my_variable_containing_the_word_delimiter
но воткнув его в переменной должен работать нормально во всех снарядов я знаю
Разделитель

Единственный нюанс заключается в том, что вы не можете контролировать, если вы получаете новую строку в конце или нет: вы всегда сможете сделать перевод строки в конце. Большую часть времени, это, наверное, то, что вы хотели или это не имеет значения. Кроме того, многие (все?) снаряды использовать временные файлы на диске, чтобы реализовать здесь-файлов, поэтому можно столкнуться с ситуацией, когда очень ограничен, система не позволяет (тот же нецензурно калекой нашем экземпляре без Е у меня тоже есть SELinux в политику, или некоторые другие разрешения, ограничения (я не помню точно), которые препятствуют оболочки от создания временных файлов).

Из-за этого, по компьютерной безопасности, обратите внимание, если вам нужно распечатать конфиденциальные данные, здесь-файл может быть хуже или лучше, чем эхо, в зависимости от конкретной системы (это эхо внешняя или встроенная? такое /proc/$PID в мире или пользователей читаемым? здесь-файлы пользователя или читать?), и ваше точное угроза-модель (ваша угроза более вероятно, чтобы обследовать диске, чем ваш ход информационного процесса?)

выраж

Малоизвестная особенность выражение , что он может извлечь и напечатать подстроки в спор с regex матча. Это в основном более портативная версия оригинальной Эхо поведение (печатать текст дословно, и один символ новой строки), и это еще более портативный способ печатать обычный текст, чем функции printf:

выражение х"$my_var_holding_my_text" : 'х\(.*\)'

и

выражение х Косьмы и текст в одинарные кавычки: не\"t забудьте только '\" должен вырваться в одинарные кавычки строковые литералы' : 'х\(.*\)'

Это работает, вернемся к V7 в ОС UNIX. В Х в передней части обе строки/переменная для печати и в передней части регулярного выражения за пределами в \( \) суб-шаблон матч/выбор важно: бывшая сохраняет значение вы печатаете от неправильно истолковано выражение команды как выражение сайта, а тот потом делает, что Х на самом деле не печатается.

на awk

Вот такой компактный , как awk команду, которая будет печатать всего один-строковые аргументы, которые он получает однозначно (вы все еще есть проблемы с обратной косой черты на более поздние версии на awk - спасибо Стефан за то, что напомнили мне об этом в комментариях):

: | у awk 'начало { ОРС="" } конец { печати V } в="$my_var_with_my_string"

Это работает, вернемся к V7 в ОС UNIX. Если у вас нет обратных косых черт, это очень портативный, и может быть достаточно хорошо для текста нужно для вывода. Вы также можете найти написания характеристика-тесты для различных awk и реализации в скриптах легче/проще/чище, чем Эхо работать на вас, поскольку в то время как есть определенно много отклонений среди На awks, есть меньше вариантов, чтобы проверить, чем Эхо , если ваша основная цель-просто писать какой-то конкретный вывод.

Очевидно, используйте одинарные кавычки техника строку, если вы хотите использовать литерал вместо переменной. Сделать эхо без аргументов, если вы хотите новую строку после нее (или взять время, чтобы тщательно вет определенным образом для обеспечения новой строки получает напечатанную на awk команду - предлагаю замену : нет команды слева от трубы с "Эхо" без аргументов, но я не тщательно ревизовал эту идею до всех переносимости)..

Эхо передается через СЭД или похожие

Если вы знаете, что ваш вклад не являются специальными (не управляющими восьмеричные Escape как \000 на входе вы хотите напечатать буквально, и нужно просто избегать специально для анализа - характера, например, вы хотите напечатать , вы все равно можете сделать произвольный Эхо работает для вас, если у вас есть что-то еще можно использовать для предварительной обработки Эхо'ы выход:

Эхо х-е | е 1 ы/^х//'

Для общества, четко определены необходимые ресурсы, вы могли бы уйти с тривиальным СЭД замены такой. В зависимости от того, что именно вам нужно, он может получить все труднее. В определенный момент, лучше перейти на следующий вариант:

Характеристика-тест Эхо

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

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

минус=
случае `эхо` в '-')
минус=-
эсок
# если Эхо корректно обрабатывает буквальном минус $минус-это теперь не пустой
случае `эхо '\055" в
'-')
минус='\055'
эсок
# если Эхо разбирает управляющими сбегает по умолчанию, $минус
# теперь правильный восьмеричной избежать обратной косой черты для ASCII "-"

Вы можете построить аналогичные тесты для конкретных вещах: Эхо -е '\055' (разделительная либо выходные -э \055 или -), эхо -е '\055' (если это разбор обратного слэша по умолчанию, и вы хотите попробовать их отключения) и т. д.

Многие современные экземпляры эхо будет разбирать другие escape-последовательностями, чем восьмеричные числа, но вы можете либо функции-тест специально для тех (Эхо '\x2d' или как там) - но я думаю, в большинстве случаев, вы просто хотите найти множество аргументов, которые можно передать Эхо, чтобы заставить его печатать вещей, не делая особых замен на содержание, то кормить его вывода требуется дословно.

В зависимости от ваших потребностей, Эхо -Н также может быть стоит попробовать, но имейте в виду, что подстановка команд всегда удаляет последний символ новой строки (только последний на большинстве снарядов, но все конечные символы новой строки на некоторых снарядов), так что ваши две вероятные параметры вывода буквальное и пустую строку.

Вы можете также хотеть консультироваться автонастройки и М4 источники, потому что я считаю эти инструменты выходят из их пути, чтобы найти Эхо они могут использовать, чтобы делать однозначные печати, если они не могут найти е или еще что-то, что работает.

Буквально все остальное

Я действительно думаю только о том, что не зависит от вас грубой силы-искать точно эхо будет лучше. Весьма вероятно, что особое эхо не будет установлен или не установлен, куда вы смотрите, или что автоматический брутфорс поиск начиная с / приведу некоторые бедняга системы вниз ползти.

И в то время как очень маловероятно, но возможно, двоичный пройдет палец-печать за то, что в GNU coreutils эхо, но будет иметь поведенческое различие: даже если ГНУ не меняет их реализации, кто-то может обернуть свои версии GNU-это эхо , чтобы не делать то, что они считают глупым поведением (прозрачно проходя через все аргументы, кроме тихо падали те, которые являются особенными при установке тех, кого они хотят тривиально в shell-скрипт, так что вы могли бы легко имеют Эхо-помогает печатать нужный текст, но эхо -е '\055' неправильный поступок). И нет, даже не бинарный , который проходит тщательный дактилоскопии точно: я редактировал эльф сырые двоичные файлы, чтобы изменить поведение раньше, и я сделаю это снова. Иногда для получения очень полезных функций (не тихо падали сообщения, содержащие не-ASCII байта, Юникод, как смайлики, В С закрытым исходным кодом программного обеспечения для обмена сообщениями) и иногда для очень мелких вещей, таких как изменение жестко по умолчанию ПС1 в раковинах быть \$\ вместо \Вт \$). Я лично не имею достаточно причин, чтобы сделать это на Эхо , потому что в системах я, на самом деле, я просто игнорирую Эхо практически для всех серьезная работа, но кто-то может чувствовать себя так сильно о по умолчанию Эхо поведение, как я отношусь к умолчанию ПС1 значений переменных. Так ты вернулся, чтобы показать-тестирование Эхо, после чего см. выше в разделе.

Также, обратите внимание, что у меня есть системы, где в GNU coreutils Эхо устанавливается как приглашают остановиться, так что ни эффективный поиск в пути, и, вероятно, установить места, ни перебора искать файлы только по имени Эхо, найдет этих систем.

И я бы поспорить, что еще некоторые скриптовый язык, как в Perl установлен, что можно делать, что хочешь, чем системы, которые есть GNU coreutils Эхо конкретно: в некоторых скриптовых языков широко распространены и в основном есть одна из реализаций или хорошо определенной спецификации, в то время как эхо реализаций множество и точно следовать один спец: "сделать что-то немного отличается, чем, как и многие другие Эхо реализаций, как это возможно".