Вот ответ, который я дал бы, если бы я на самом деле задал этот вопрос в интервью:
В какой среде это где я bash
но не tail
? Возможно, ранние сценарии загрузки? Можем ли мы получить busybox
, чтобы мы могли использовать полный набор утилит оболочки? Или, может быть, мы должны увидеть, можем ли мы сжать урезанный интерпретатор Perl, даже без большинства модулей, которые облегчили бы жизнь. Вы знаете, dash
намного меньше, чем bash
и отлично подходит для использования в скриптах, верно? Это также может помочь. Если ни одна из них не является опцией, мы должны проверить, сколько пространства потребуется для статической связи C mini- tail
, я готов поспорить, что могу поместиться в том же количестве блоков диска, что и требуемый сценарий оболочки.
Если это не убедить интервьюер, что это глупый вопрос, то я иду на заметить, что я не верю в использовании расширений Баша, потому что только хорошая причина, чтобы написать что-нибудь сложное в сценарии оболочки в настоящее время если общая переносимость является главной проблемой. Избегая чего-либо, что не переносится даже в одноразовых случаях, у меня не развиваются вредные привычки, и У меня не возникает соблазна сделать что-то в оболочке, когда это будет лучше сделано на реальном языке программирования.
Теперь, в действительно портативной оболочке, массивы могут быть недоступны. (Я действительно не знаю, имеет ли спецификация оболочки POSIX массивы, но там, конечно же, есть устаревшие оболочки Unix, которые их не имеют.) Итак, если у вас есть, чтобы эмулировать tail
, используя только встроенные оболочки, и он должен работать везде, это лучшее, что вы можете сделать, и да, это отвратительно, потому что вы пишете на другом языке:
#! /bin/sh
a=""
b=""
c=""
d=""
e=""
f=""
while read x; do
a="$b"
b="$c"
c="$d"
d="$e"
e="$f"
f="$x"
done
printf '%s\n' "$a"
printf '%s\n' "$b"
printf '%s\n' "$c"
printf '%s\n' "$d"
printf '%s\n' "$e"
printf '%s\n' "$f"
Регулировка количества переменных в соответствии с количеством строк, которые вы хотите напечатать.
Боевой шрам может означать, что printf
не доступен на 100%. К сожалению, если все, что у вас есть, это echo
, вы находитесь в ручье: некоторые версии echo
не могут печатать литеральную строку «-n
», а другие не могут печатать буквальную строку «\n
» и даже выяснить, какой из них у вас есть боли, особенно в том случае, если у вас нет printf
(который равен в POSIX), у вас, вероятно, также нет пользовательских функций.
(NB Код в этом ответе, без обоснования, был первоначально размещен пользователем «NIRK», но затем удаляется под давлением downvote от людей, которых я милосердно предполагающих не было известно, что некоторые оболочки не имеют массивы.)
«в Баш» «в оболочке» не вы имеете в виду какие-либо внешние команды нет t разрешено использовать? например sed/awk/wc? – Kent
@ t0mmyt Эта реальная реализация без использования буфера и просто поиск невозможна с помощью stdin или pipe. Что касается чтения назад, я не уверен в этом, но все возможно, если вы уже используете массивы. Пожалуйста, проверьте мое решение, написанное в чистом баше. Я думаю, что более чем достаточно, чтобы доказать эту концепцию. – konsolebox