Лучшая оболочка Linux? [закрытый]

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

  • другие предложения слишком тяжелы и слишком громоздки для моей ситуации
  • Я поддерживаю конечное количество языков на моем веб-сайте (на данный момент два ]: 'en' и 'de' - но решение обобщено для большего).
  • Мне нужно правдоподобное предположение о языке сгенерированной пользователем строки, и у меня есть запасной вариант (языковая настройка пользователя).
  • Итак, я хочу найти решение с минимальными ложными срабатываниями - но меня не волнует ложных отрицаний .

Решение использует 20 наиболее распространенных слов в языке, подсчитывает вхождения в стоге сена. Затем он просто сравнивает количество первых и вторых наиболее просчитанных языков. Если номер занявший второе место составляет менее 10% от победителя, победитель получает все.

Кодекс - любые предложения по улучшению скорости приветствуются!

    function getTextLanguage($text, $default) {
      $supported_languages = array(
          'en',
          'de',
      );
      // German word list
      // from http://wortschatz.uni-leipzig.de/Papers/top100de.txt
      $wordList['de'] = array ('der', 'die', 'und', 'in', 'den', 'von', 
          'zu', 'das', 'mit', 'sich', 'des', 'auf', 'für', 'ist', 'im', 
          'dem', 'nicht', 'ein', 'Die', 'eine');
      // English word list
      // from http://en.wikipedia.org/wiki/Most_common_words_in_English
      $wordList['en'] = array ('the', 'be', 'to', 'of', 'and', 'a', 'in', 
          'that', 'have', 'I', 'it', 'for', 'not', 'on', 'with', 'he', 
          'as', 'you', 'do', 'at');
      // clean out the input string - note we don't have any non-ASCII 
      // characters in the word lists... change this if it is not the 
      // case in your language wordlists!
      $text = preg_replace("/[^A-Za-z]/", ' ', $text);
      // count the occurrences of the most frequent words
      foreach ($supported_languages as $language) {
        $counter[$language]=0;
      }
      for ($i = 0; $i < 20; $i++) {
        foreach ($supported_languages as $language) {
          $counter[$language] = $counter[$language] + 
            // I believe this is way faster than fancy RegEx solutions
            substr_count($text, ' ' .$wordList[$language][$i] . ' ');;
        }
      }
      // get max counter value
      // from http://stackoverflow.com/a/1461363
      $max = max($counter);
      $maxs = array_keys($counter, $max);
      // if there are two winners - fall back to default!
      if (count($maxs) == 1) {
        $winner = $maxs[0];
        $second = 0;
        // get runner-up (second place)
        foreach ($supported_languages as $language) {
          if ($language <> $winner) {
            if ($counter[$language]>$second) {
              $second = $counter[$language];
            }
          }
        }
        // apply arbitrary threshold of 10%
        if (($second / $max) < 0.1) {
          return $winner;
        } 
      }
      return $default;
    }
27
задан sanity 1 June 2009 в 03:22
поделиться

7 ответов

You can run PowerShell on Linux via Pash. It uses Mono the way PowerShell uses .NET.

6
ответ дан 28 November 2019 в 04:54
поделиться

You do realize bash 4 has very recently been released with a load of new features and language additions?

  • Shell options globstar (**/foo) does a recursive search, dirspell fixes typos during pathname expansion.
  • Associative arrays, map strings to strings, instead of just numbers to strings.
  • The autocd shell option allows changing directories by just typing the directory path instead of having to put cd in front.
  • Coprocesses
  • &>> and |& redirection operators that redirect both stdout and stderr
  • Loads of additions to existing builtins for improved scripting convenience.

Check out:

21
ответ дан 28 November 2019 в 04:54
поделиться

Я бы посмотрел на zsh или fishshell.

8
ответ дан 28 November 2019 в 04:54
поделиться

Я думаю, что "исходная улучшенная оболочка" - это ksh93 . bash появился в то время, когда исходный код ksh был проприетарным; если бы тогда ksh был с открытым исходным кодом, возможно, не было бы необходимости иметь новую оболочку (хотя с FSF вы никогда не узнаете). ksh стоит изучить, особенно из-за его способности расширяться с помощью модулей C, но это не явная победа над bash. Автозаполнение bash явно превосходит его, что может быть достаточно, чтобы в целом bash выиграл. В любом случае bash и ksh приложили значительные усилия для схождения, поэтому различия незначительны.

Другая интересная оболочка - zsh , которая пытается быть всем, что есть ksh, но в то же время включает csh. Поскольку я никогда не видел смысла или использования csh, я не тот человек, который защищает zsh. Я отмечу одну необычную несовместимость: по умолчанию в zsh переменная $ var всегда расширяется до одного токена, даже если она содержит пробелы. Это поведение несовместимо со всеми другими оболочками, производными от sh, и иногда оно неудобно, но на самом деле оно имеет гораздо больше смысла, чем оригинал, и избавляет от утомительного цитирования.

csh была первой оболочкой, которая есть контроль работы, но, на мой взгляд, он (и его последователи) был заменен bash и ksh. Писать сценарии никогда не было особенно весело.

Наконец, есть много крошечных оболочек, предназначенных для спасательных дискет (!) И других спартанских сред, но похоже, что вас они мало интересуют.

(В этом вопросе) Из нововведений я должен добавить, что более половины сценариев, которые я писал в качестве сценариев оболочки, теперь являются сценариями Lua . Другие могли сказать то же самое для Python или Ruby, а в свое время Perl или Tcl. Так что я думаю, что настоящее нововведение - это переход от оболочки для программируемого взаимодействия в командной строке.)

6
ответ дан 28 November 2019 в 04:54
поделиться

Может быть интересно добавить несколько фигур Linux / Mac в смесь?

Я знаю Ubuntu идет с Mono , установленным по умолчанию с версии не ниже 8.04

и пусть оболочка запускает их как встроенные.

Допустим, вы пишете загружаемое 'on' ... и хотите, чтобы он работал так:

on node 123 run some command
on class nodes run some command
on all nodes run some command

... и т. д.

Вы можете следовать простым примерам на как написать загружаемый файл, а затем включить его как встроенный в bash через enable -f / path / to / loadable loadable_name

Итак, в нашем случае, enable -f / opt / bash / loadables / on

.. . в вашем bashrc, и он у вас есть.

Итак, если вы хотите, чтобы bash изначально интерпретировал ваш элегантный новый язык, вы должны написать загружаемый файл с именем 'use' или 'switch_to', а затем изменить синтаксический анализатор для загрузки другая грамматика / время выполнения, если была установлена ​​определенная переменная среды.

То есть:

#/bin/bash

switch_to my-way-cool-language

funkyfunc Zippy(int p) [[
   jive.wassup(p) ]]

Однако большинство людей не захотят взломать свою оболочку. Я действительно хотел указать, что существуют средства, позволяющие взять Bash и сделать его таким, каким вы его хотите, не возясь с основным кодом.

См. / path-to-bash-source / examples / loadables, вы можете заставить его летать, где бы вы ни работали, поскольку вы все еще используете Bash.

7
ответ дан 28 November 2019 в 04:54
поделиться

IIRC, Powershell является объектно-ориентированным, тогда как большинство оболочек и утилит unix работают с текстом. В связи с этим вас может заинтересовать Squirrel Shell . Но я никогда им не пользовался.

3
ответ дан 28 November 2019 в 04:54
поделиться

If you’re willing to lose sh compatibility, you could look at using a scripting language like Python or Tcl as your shell. rlwrap can be very handy if the interpreter doesn't provide line editing, command history, completion, etc.

One philosophy regarding shells is that they should primarily only be used to connect processes with files (here is one page that espouses that approach). That said, people have written some remarkably complex software using them.

3
ответ дан 28 November 2019 в 04:54
поделиться