Решение оболочки:
#!/bin/bash
IFS=
before=
read -r current
while read -r after
do
[[ "$before" < "$current" || "$before" = "$current" ]] &&
[[ "$current" < "$after" || "$current" = "$after" ]] &&
printf '%s\n' "$current" &&
before="$current"
current="$after"
done
[[ "$before" < "$current" || "$before" = "$current" ]] &&
printf '%s\n' "$current"
Использование: ./ script
Обратите внимание, что с bash
вы можете использовать [[..]]
сравнения, чтобы лексические сравнения зависели от локали и были менее наивными (должны работать с ä, ö, à и т. д.).
Что касается точки зрения Стефана о том, как решить для последнего примера в вопросе, это отдает предпочтение более позднему случаю. Таким образом, он фактически удалит C
.
while IFS= read -d '' -r line; do
printf "%s\0" "$line"
done > executable-file < /lib64/ld-2.17.so
использует только встроенные в оболочку -ins, поэтому ему не нужно запускать новые процессы. Сценарий восстановления предполагает, что у вас уже запущена оболочка; поскольку он уже запущен, его права доступа к диску и его библиотекам больше не имеют значения.
При таких обстоятельствах вы не сможете запустить новую оболочку, но измененные разрешения не влияют ни на что, работающее в данный момент.
Если файл, который вы пытаетесь прочитать, не имеет разрешений , это будет работать, только если вы находитесь в корневой оболочке; в противном случае перенаправление с ld-2.17.so
не удастся, так как вы не сможете читать из нечитаемого файла, если вы не являетесь пользователем root. (Здесь я игнорирую SELinux и т. д.)