Прямую совместимость гарантировать гораздо легче, чем обратную. Если ваша библиотека зависит только от среды выполнения C (glibc6), то ответ будет где-то между "вероятно" и "возможно". Если она зависит от дополнительных библиотек, вероятность успеха гораздо ниже (серьезно, никто не полагается на обратную совместимость бинарных пакетов). Но если вы хотите повысить шансы, компиляция и сборка библиотеки на более старом релизе очень помогает.
"How can I write redirection to be unnoticed to other part of shell command line?"
Ничего делать не нужно, предупреждение на stdErr. Попробуйте это:
apt list adghdgd | grep.
2>/dev/null apt list adghdgd | grep.
Если ваш дистрибутив раскрашивает grep по умолчанию, вы увидите, что часть, которая фактически попадает в grep, окрашивается. Во второй форме stdErr полностью подавляется.
Grep тоже ведет себя иначе, сравните:
echo hello | grep.
echo hello | grep. | cat
Вторая форма не окрашена, потому что grep замечает, что ее stdOut — это не терминал, а конвейер. Откуда он/она знает????
Сравните
ls -l /proc/self/fd/1
( ls -l /proc/self/fd/1 ) | cat
В первой форме stdOut — это tty/pts. Во втором труба.
apt
исторически разрабатывался с учетом использования строки интерактивной команды -, отсюда и закодированное предупреждение, которое было сделано намеренно в/с помощью apt
, а не оболочкой.
Однако apt
не обязательно анализирует командную строку; оболочка уже выполнила эту работу к моменту вызова apt
. Что делает apt
, так это обнаруживает, что поток stdout
был изменен/перенаправлен.
Что касается использования apt
в сценариях, у вас есть похожая старая команда apt-get
, которая делает примерно то же самое и не выдает этого предупреждения при перенаправлении stdout
.
TLDR Не оболочка записывает сообщение об ошибке в stderr
, это команда apt
.
Тот факт, что вы можете захватить выводapt
stderr
в оболочке, является артефактом того, что Unix является многозадачной ОС, и не означает, что этот вывод производит оболочка.
ПС. Выполняя strace по команде, видно apt
пишет это сообщение:
strace apt get install bash > a
....
write(2, "\n", 1
) = 1
write(2, "WARNING: ", 9WARNING: ) = 9
write(2, "apt", 3apt) = 3
write(2, " ", 1 ) = 1
write(2, "does not have a stable CLI inter"..., 38does not have a stable CLI interface. ) = 38
write(2, "Use with caution in scripts.", 28Use with caution in scripts.) = 28
write(2, "\n", 1
) = 1
write(2, "\n", 1
) = 1