Воспользуйтесь подсказкой Autotools: придерживайтесь наименьшего общего знаменателя оболочки Борна и POSIX - возможно, дополненного sed
- если вы нужно написать что-то, что должно работать везде . Могут существовать системы, в которых что-то ломается, но вы можете обойти такие проблемы, переписав.
Например, в некоторых древних системах есть проблемы с ошибками раскрытия в test
, также известном как [
:
if [ $foo = bar ] ; then...
, поэтому практика Autoconf состоит в том, чтобы переписать его в двойные кавычки с односимвольным префиксом, например:
if [ x"$foo" = "xbar" ] ; then...
Вы также можете использовать здесь "x $ foo"
. Это защищает от возможности того, что $ foo
может быть допустимым вариантом для test (1)
, и поскольку [
является псевдонимом для test
], это может неверно истолковать выражение. Решение состоит в том, чтобы создать ситуацию, когда неизвестный аргумент [
всегда начинается с x
, что означает, что он не может иметь особого значения для [
].
(Autoconf также рекомендует использовать test
вместо [
, но этот совет является реакцией на возможные конфликты с M4 , который также использует ] [
в его синтаксисе.)
awk - это POSIX , поэтому теоретически он доступен везде. Он есть даже в Busybox , поэтому у вас будет реализация awk
даже в некоторых очень ограниченных встроенных системах Linux. Тем не менее, я был бы менее удивлен, встретив систему без awk
, чем sed
. Полагаю, дело в сложности: более простые инструменты с большей вероятностью переживут агрессивную сортировку.
Perl не является частью какого-либо широко распространенного стандарта, POSIX или другого, поэтому вы просто не можете рассчитывать на него, если ничего заранее не знаете о целевой среде. Perl не устанавливается по умолчанию в:
Autoconf В руководстве есть глава по программированию переносимой оболочки , которая должна быть вам полезна. В последнем разделе рассматриваются такие инструменты, как sed
, awk
и многие другие.
Если я загружу исходный код для mytop , распакую архив и проверю его на компилируемость и предупреждения Perl...
perl -cw mytop
Я понял:
Useless use of private variable in void context at mytop line 994. "my" variable $data masks earlier declaration in same scope at mytop line 1028. mytop syntax OK
Изучение исходного кода подтверждает эти предупреждения. В строке 994 имеем:
994 print GREEN() if ($Ratio_now => 80.0);
Оператор толстой стрелки ('=>' )должен быть оператором сравнения числового равенства ('==' ).
Есть два объявления $data в одной области видимости:
1020 my($data) = Hashes('show global variables like "read_only"'); ... 1028 my($data) = Hashes('SHOW SLAVE STATUS');
Таким образом, исходный код является -оптимальным кодом Perl 5.
У меня нет Gentoo, но, учитывая номера строк, я подозреваю, что пакет Gentoo не смог исправить эти проблемы. (У меня Ubuntu; версия mytop для Debian/Ubuntu не выдает этих предупреждений и сильно отличается от исходного кода.)
Несмотря на предупреждения, исходный код компилируется. Следовательно, предупреждения, которые выдает исходная версия, могут не объяснять segfaults, которые вы видите. Но я думаю, вам нужно обсудить эту проблему с теми, кто поддерживает mytop для Gentoo.