REDUX: Как преодолеть несовместимость между ksh в Linux и установленной в AIX / Solaris / HPUX? - PullRequest
2 голосов
/ 18 сентября 2008

Я обнаружил еще одну проблему при попытке перенести несколько сотен сценариев ksh с AIX, Solaris и HPUX на Linux. См. здесь для предыдущей проблемы.

Этот код:

#!/bin/ksh
if [ -a k* ]; then
    echo "Oh yeah!"
else
    echo "No way!"
fi
exit 0

(при запуске в каталоге с несколькими файлами, имя которых начинается с k), выдает «О, да!» при вызове с вариантами AT & T ksh (ksh88 и ksh93). С другой стороны выдает и сообщение об ошибке, сопровождаемое «Ни за что!» на других вариантах ksh (pdksh, MKS ksh и bash).

Опять же, мой вопрос:

  • Существует ли переменная окружения, которая заставит pdksh вести себя как ksh93? В противном случае:
  • Есть ли на pdksh возможность получить требуемое поведение?

Ответы [ 4 ]

5 голосов
/ 23 декабря 2008

Я бы больше не использовал pdksh в Linux. Поскольку AT & T ksh стала OpenSource, есть пакеты, доступные в различных дистрибутивах Linux. Например. RedHat Enterprise Linux и CentOS включают ksh93 в качестве RPM-пакета «ksh».

pdksh до сих пор упоминается во многих документах с требованиями к установке от поставщиков программного обеспечения. Мы заменили pdksh на всех наших системах Linux на ksh93 без проблем.

0 голосов
/ 26 апреля 2010

в Bash тестовая операция выполняется для одного файла.

Я предполагаю, что в Ksh88 тест -a выполняется для одного файла, но не жалуется, потому что другие тестовые слова являются неопределенным условием для -a.

вы хотите что-то вроде

for K in /etc/rc2.d/K* ; do test -a $K && echo heck-yea ; done

Я могу сказать, что ksh93 в этом отношении работает как bash. К сожалению, я думаю, что код был написан плохо, на мой взгляд, и, вероятно, плохое мнение, поскольку основной причиной проблемы является встроенный тест ksh88, допускающий небрежный код.

0 голосов
/ 17 сентября 2009

Ну, через год, похоже, нет решения моей проблемы.

Я добавляю этот ответ, чтобы сказать, что мне придется с этим жить ......

0 голосов
/ 19 сентября 2008

Вы понимаете, что [это псевдоним (часто ссылка, символьный или жесткий) для /usr/bin/test, верно? Так что, возможно, настоящая проблема заключается в разных версиях /usr/bin/test?

OTOH, ksh переопределяет его встроенным. Может быть, есть способ заставить его этого не делать? или, может быть, вы можете явно указать псевдоним [to /usr/bin/test, если /usr/bin/test на всех платформах совместим?

...