Как я могу безопасно получить версию ksh?

Я думаю, что Вы ищете альтернативу для winform для C# в Linux, посмотрите на сообщение на stackoverflow https://stackoverflow.com/questions/3693656/alternative-to-winforms-that-can-be-easily-used-with-c-sharp-and-net

Или ищите Google то же.

12
29.03.2016, 16:24
6 ответов

В то время как я писал скрипт для КШ , я заметил, что -A вариант встроенного Команда, кажется, не поддерживается в более старых версиях ksh . И это, кажется, верно для всех систем, которые я проверил, который включал Solaris, Aix, HP-UX и Linux.

Итак, вот решение в качестве функции ksh:

is_modern_ksh() {
  if whence -a whence > /dev/null 2>&1 ; then
    return 0 #success -> true
  fi
  #Else the call to `whence` failed because `-a` is not supported
  return 1 #failure -> false
}

И вот как его использовать:

if is_modern_ksh ; then
  echo "You're using a MODERN version of ksh. :)"
else
  echo "You're using an OLD version of ksh. :("
fi
2
27.01.2020, 19:55

Для "настоящих" ksh релизов (т.е. На базе AT&T) я использую эту команду:

strings /bin/ksh | grep Version | tail -2 

Вот различные выходы, которые я получаю:

Original ksh:

@(#)Version M-11/16/88i

dtksh;

@(#)Version 12/28/93
Version not defined

Modern ksh93:

@(#)$Id: Version AJM 93u+ 2012-08-01 $

Для pdksh/msh ksh клонов и современных версий AT&T ksh тоже есть кое-что, что работает:

$ mksh -c 'echo $KSH_VERSION'
@(#)MIRBSD KSH R50 2015/04/19

Edit:

kshksh. Я не заметил, что вы спрашивали об этом изнутри скрипта, не зная путь к тестируемому двоичному файлу ksh.

Если вы действительно хотите, чтобы использовалась версия ksh, а не те возможности, которые она поддерживает, вот один из способов сделать это, используя только команду strings, которая должна работать, по крайней мере, на Linux и Solaris:

echo $(for i in $(find /proc/$$ ! -type d ! -name "pagemap" | 
  grep -v "/path/" | grep -v "/fd/" ) ; do
  strings $i | egrep "([V]ersion|[K]SH_VERSION).*[0-9]" | sort -u
done 2>/dev/null)

Обратите внимание, что этот метод ненадежен, так как /proc может быть не смонтирован, и, конечно, есть и другие слабые места. Он не протестирован на других Unix операционных системах.

5
27.01.2020, 19:55

Эти команды сделали хитрость:

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
-121--13315-

Вы можете сделать это с аудио cd функции k3b. Просто добавьте файлы в проект и запустите процесс записи. K3b перепишет файлы, прежде чем на самом деле их записать. Если вам нужны дополнительные кодеры для выполнения перекодировки, вы будете уведомлены об этом.

-121--217256-

CTRL + ALT + V

или

ESC , CTRL + V

Как правило, доказали свою высокую надежность при интерактивном определении используемой версии KSH, однако создание сценариев доказало свою эффективность

1
27.01.2020, 19:55

Я думаю, что .sh.version существует с момента первой версии ATT KSH 93. Он не доступен в PDKSH или MKSH. С $ {. Sh.version} - это синтаксическая ошибка в оболочках, отличных от ksh93, оберните тест для него в подставке и защищают его позади EVAL .

_sh_version=$(eval 'echo "${.sh.version}"' 2>/dev/null) 2>/dev/null
case $_sh_version in
  '') echo "This isn't ATT ksh93";;
  …
esac

ksh_version Начал в общественном домене KSH клона (PDKSH) и был добавлен к фактической оболочке Korn сравнительно недавно, в 2008 году с KSH93T.

, а не тест на номер версии, вы должны проверить для конкретной функции, которая дает вам горе. Большинство функций могут быть проверены на пробовать какую-то конструировать в подпункте и посмотреть, запускает ли он ошибкой.

7
27.01.2020, 19:55

KSH_VERSION не был реализован в ksh93 до версии 93t. Он будет установлен в mksh , pdksh , lksh . Итак, чтобы проверить версию ksh , мы можем попробовать следующие шаги:

  • Проверка KSH_VERSION для обнаружения mksh , pdksh , lksh
  • Если первый шаг завершился неудачно, попробуйте функцию, которая отличается для ksh93 и ksh88 / 86 ( Пусть Дэвид Корн покажет нам ).

Имея это в виду, я выберу:

case "$KSH_VERSION" in
  (*MIRBSD*|*PD*|*LEGACY*) printf '%s\n' "$KSH_VERSION" ;;
  (*) [ -z "$ERRNO" ] && printf '%s\n' "${.sh.version}" || echo ksh88/86 ;;
esac
6
27.01.2020, 19:55

Я думаю, что основная проблема с использованием $ {. Sh.version} заключается в том, что ksh88 просто останавливается с ненулевым кодом выхода.

Итак, мое решение состоит в том, чтобы поместить код, который ссылается на $ {. Sh.version}, во вспомогательную оболочку, а затем проверить, выходит ли эта вспомогательная оболочка ненулевым значением и имеет ли во вспомогательной оболочке код, который будет работать в версиях ksh, где ссылка на $ {. sh.version} действительно работает. Оборачивание его в функцию, которая затем вызывается другой функцией, которая меняет код возврата, так что последний вызов проверяет истинность.

function is_oldksh
{
    (test -n ${.sh.version}) 2>/dev/null
}

function oldkshtest
{

    is_oldksh || return 0 && return 1
}

oldkshtest && echo "old ksh" || echo "new ksh"

Я запускал это в AIX и Oracle Enterprise Linux 5 и 6 с ksh88, ksh93 и pdksh.

Пит

0
27.01.2020, 19:55

Теги

Похожие вопросы