fish - это оболочка Unix , ориентированная на интерактивность и удобство использования. Fish предназначена для предоставления пользователю функций по умолчанию, а не по конфигурации. [4] Fish считается экзотической оболочкой, поскольку на усмотрение разработчиков она не строго соответствует стандартам оболочки POSIX . [5]
Автор (ы) оригинала | Аксель Лильенкранц |
---|---|
Разработчики) | смешная рыба, ситшвар, ЯнКанис [1] |
Первый выпуск | 13 февраля 2005 г . |
Стабильный выпуск | 3.2.2 [2] / 7 апреля 2021 г . |
Репозиторий | |
Операционная система | Unix-подобный |
Тип | Оболочка Unix |
Лицензия | GPL v2 [3] |
Веб-сайт | Fishshell |
Особенности
В Fish есть автоматические подсказки " поиск по мере ввода " на основе истории и текущего каталога. По сути, это похоже на поиск в истории + Bash , но поскольку он всегда включен, а не является отдельным режимом, пользователь получает непрерывную обратную связь при написании командной строки и может выбирать предложения с помощью клавиш со стрелками или, как в Bash, нажимать для вместо этого завершение табуляции. Автозавершение с табуляцией - это многофункциональная функция, позволяющая расширять пути к файлам (с использованием подстановочных знаков и скобок ), переменных и многих дополнений для конкретных команд. Завершение для конкретных команд, включая параметры с описаниями, в некоторой степени могут быть сгенерированы из справочных страниц команд.CtrlRTab ↹
Fish имеет несколько синтаксических правил, предпочитая функции как команды, а не синтаксис. Это делает функции доступными для обнаружения в виде команд с параметрами и справочными текстами. Функции также могут иметь понятное для человека описание. Специальная команда справки дает доступ ко всей документации по рыбкам в веб-браузере пользователя . [6]
Синтаксис
Синтаксис напоминает оболочку, совместимую с POSIX (например, Bash), но имеет важные отличия в том, что создатели считают, что оболочка POSIX была плохо спроектирована. [7]
# Назначение переменной, установите для переменной 'foo' # значение 'bar'. Fish не использует оператор =, поскольку # он по своей природе чувствителен к пробелам. Кроме того, команда set # легко расширяется для работы с массивами, областью видимости и т. Д. > Set foo bar > echo $ fooбар # Подстановка команды, назначьте вывод команды # 'pwd' переменной 'wd'. Fish не использует знак `` #, поскольку они не могут быть вложены друг в друга и выглядят слишком похожими ''. # Не используйте $ (), так как $ используется только для # расширения переменной в fish. > установить wd ( pwd ) > echo $ wd~# Массив переменных. 'A' становится массивом с 5 значениями: > set A 3 5 7 9 12 # Нарезка массива. 'B' становится первыми двумя элементами 'A': > set B $ A [ 1 2 ] > echo $ B 3 5 # Вы можете индексировать другие массивы и даже вывод команды # подстановки: > echo $ A [( seq 3 )] 3 5 7 # Удаляем третий и пятый элементы 'A' > set --erase A [ $ B ] > echo $ A 3 5 9# for-loop, конвертировать jpeg в png > для i в * .jpg convert $ i ( basename $ i .jpg ) .png end # Точки с запятой работают как символы новой строки: > for i in * .jpg ; convert $ i ( базовое имя $ i .jpg ) .png ; end # но многострочную форму удобно использовать, потому что # fish поддерживает многострочную историю и редактирование.# while-loop, читать строки / etc / passwd и выводить из файла пятое # поле, разделенное двоеточиями. Это должно быть # описание пользователя. > при чтении строка set arr ( echo $ line | tr: \ n ) echo $ arr [ 5 ] end < / etc / passwd
Нет неявной подоболочки
Некоторые языковые конструкции, такие как конвейеры , функции и циклы , были реализованы с использованием так называемых подоболочек в других языках оболочки . Подоболочки - это просто дочерние программы, которые запускают несколько команд для оболочки и затем завершают работу. К сожалению, эта деталь реализации обычно имеет побочный эффект, заключающийся в том, что любые изменения состояния, сделанные в подоболочке, такие как присвоение переменных, не распространяются на основную оболочку, что может удивить пользователя. Рыба никогда не раскалывает так называемые подоболочки; все встроенные функции всегда полностью функциональны.
# Это не будет работать во многих других оболочках, так как встроенная # read будет работать в своей собственной подоболочке. В Bash правая часть канала # не может иметь никаких побочных эффектов. В ksh приведенная ниже команда работает, но # левая сторона не может иметь никаких побочных эффектов. В fish и zsh обе стороны # могут иметь побочные эффекты. > кот * .txt | читать строку
Пример присвоения переменной
Этот пример Bash не делает того, что выглядит: поскольку тело цикла является подоболочкой, обновление до $found
не является постоянным.
found = ''
cat / etc / fstab | пока читал dev mnt rest ; делать, если тест " $ mnt " = "/" ; затем found = " $ dev " fi готово
Обходной путь:
found = '' при чтении dev mnt rest ; делать, если тест " $ mnt " = "/" ; затем found = " $ dev " fi done
Fish не требует обходного пути:
найден набор "
cat / etc / fstab | while read dev mnt rest if test " $ mnt " = "/" set нашел $ dev end end
Полезные сообщения об ошибках
Сообщения об ошибках в fish предназначены для того, чтобы фактически сообщить пользователю, что пошло не так и что с этим можно сделать. [8]
> foo = bar fish: Неизвестная команда «foo = bar». Вы имели в виду «установить ПЕРЕМЕННОЕ ЗНАЧЕНИЕ»? Для получения информации о настройке значений переменных см. Раздел справки по команде set, набрав «help set».> echo $ {foo} bar fish: Вы имели в виду {$ VARIABLE}? Символ «$» начинается с имени переменной . Скобка, которая стоит сразу за символом «$», не может быть частью имени переменной, а имена переменных не могут быть длиной в ноль символов . Чтобы узнать больше о расширении переменных в fish, введите «help expand-variable».> echo $ (pwd) fish: Вы имели в виду (КОМАНДА)? В fish символ «$» используется только для доступа к переменным. Чтобы узнать больше о подстановке команд в fish, введите «help expand-command-substitution».
Универсальные переменные
Fish имеет функцию, известную как универсальные переменные, которая позволяет пользователю постоянно присваивать значение переменной для всех запущенных рыбных панцирей. Значение переменной запоминается при выходе из системы и перезагрузке, а обновления немедленно распространяются на все запущенные оболочки.
# Это сделает emacs текстовым редактором по умолчанию. '--Universal' (или '-U') приказывает рыбе # сделать эту переменную универсальной. > набор - универсальный РЕДАКТОР emacs# Эта команда сделает текущую часть рабочего каталога в приглашении fish # синим на всех запущенных экземплярах fish. > набор - универсальный fish_color_cwd синий
Другие особенности
- Расширенное завершение вкладки.
- Подсветка синтаксиса с обширной проверкой ошибок.
- Поддержка для X буфер обмена .
- Интеллектуальная обработка терминала на основе terminfo .
- Доступная для поиска история команд .
Версия 2 добавляет:
- Самовнушения
- 256 цветов терминала
- Конфигурация через Интернет
- Повышена производительность (за счет большего количества встроенных функций).
Таблица перевода bash / fish
Характерная черта | Синтаксис Bash | синтаксис рыбы | Комментарий |
---|---|---|---|
расширение переменной: с разделением слов и интерпретацией глобуса | $ var или же $ {var [@]} или же $ {var [*]} | намеренно опущено | Определен как основная причина ошибок в языках оболочки, совместимых с posix [9] |
расширение переменной: скаляр | "$ var" | намеренно опущено | Каждая переменная - это массив |
расширение переменной: массив | "$ {var [@]}" | $ var | Цитирование не обязательно для подавления разбиения слов и интерпретации глобусов. Вместо этого цитирование означает сериализацию. |
расширение переменной: как строка, разделенная пробелами | "$ {var [*]}" | "$ var" | |
редактировать строку в текстовом редакторе | Ctrl+ X, Ctrl+E | Alt+E | При вызове перемещает ввод строки в текстовый редактор. |
оценить ввод строки | Ctrl+ Alt+E | Не указано [10] | Оценивает выражения на месте в строковом редакторе |
завершение истории | Ctrl+R | скрытый | |
подмена истории | !! | намеренно опущено | Не обнаруживается |
явная подоболочка | (выражение) | рыба -c выражение | |
подстановка команд | "$ (выражение)" | (выражение) | |
замена процесса | <(выражение) | (выражение | psub) | Команда, а не синтаксис |
логические операторы | ! cmd && echo FAIL || эхо ОК | не команда и эхо FAIL или эхо OK | |
присвоение переменных | var = значение | установить значение переменной | |
обработка строки: заменить | "$ {HOME / alice / bob}" | строка replace alice bob $ HOME | |
обработка строк: удаление префикса или суффикса, не жадно или жадно | var = abc " $ { var # *. } " #bc " $ { var ## *. } " #c " $ { var %. * } " #ab " $ { var %%. * } " #a | string replace --regex '. *? \. (. *)' '$ 1' abc #bc
string replace --regex '. * \. (. *)' '$ 1' abc #c
string replace --regex '( . *) \ .. * ' ' $ 1 ' abc #ab
string replace --regex ' (. *?) \ .. * ' ' $ 1 ' abc #a | |
экспортная переменная | экспорт var | установить --export var | Параметры, доступные через завершение вкладки |
локальная переменная функции | местная вар | по умолчанию | |
локальная переменная области видимости | нет эквивалента | установить --local var | |
удалить переменную | unset var | set --erase var | |
проверьте, существует ли переменная | test -v var | set --query var | |
инициализация массива | var = (abc) | установить var abc | Каждая переменная - это массив |
итерация массива | для i в " $ { var [@] } " ; do echo " $ i " готово | для i в $ var echo $ i end | |
вектор аргументов: все аргументы | "$ @" | $ argv | |
вектор аргумента: индексация | «$ 1» | $ argv [1] | |
вектор аргумента: длина | $ # | (подсчитать $ argv) | |
вектор аргумента: сдвиг | сдвиг | set --erase argv [ 1 ] | |
представление массива в переменных окружения | ПУТЬ = " $ ПУТЬ : $ HOME /.local/bin" | установить PATH $ PATH $ HOME /.local/bin | Fish принимает двоеточие в качестве разделителя массива для перевода переменных в среду и из нее. Это согласуется со многими переменными среды, подобными массивам, такими как $ PATH и $ LS_COLORS. |
экспорт и запуск | LANG = C.UTF-8 python3 | env LANG = C.UTF-8 python3 | env LANG=C.UTF-8 python3 работает в любой оболочке, так как env - это отдельная программа. |
арифметика | $ ((10/3)) | математика '10 / 3 ' | expr 10 / 3 работает в любой оболочке, поскольку expr - это отдельная программа. |
escape-последовательность | $ '\ e' | \ e | printf '\e' работает в обеих оболочках; printf обе их встроенные команды совместимы с printf автономной программой GNU . [11] |
строка в одинарных кавычках: escape-последовательности | 'мама' \» 's заключительный обратный слеш: \' | 'мама \' S окончательный обратную косую черту: \\ ' | Bash требует замены только одинарной кавычки в одинарных кавычках, но длина замены составляет 4 символа. Та же замена работает в fish, но fish поддерживает для этого обычную escape-последовательность, поэтому также требует экранирования обратной косой черты (за исключением того, что разрешается одиночная обратная косая черта, которая не предшествует другой обратной косой черте или одинарной кавычке). |
Смотрите также
Рекомендации
- ^ "члены команды рыбных панцирей" . GitHub.com . Проверено 21 мая 2013 .
- ^ «Выпуск рыбы 3.2.2» .
- ^ fishshell.com Лицензия на рыбу
- ^ Лильенкранц, Аксель (17 мая 2005 г.). «Рыба - удобная оболочка» . Еженедельные новости Linux . Проверено 24 марта 2010 .
- ^ «Рыбная документация: дизайн» . Проверено 9 апреля 2021 .
- ^ Linux.com . CLI Magic: Улучшение панциря рыбой. Проверено 24 марта 2010.
- ^ Пол, Райан. «Углубленный взгляд на рыбу: дружественная интерактивная оболочка» . Ars Technica . Проверено 10 марта 2015 года .
синтаксис Posix имеет несколько отсутствующих или плохо реализованных функций, включая область видимости переменных, массивы и функции. По этой причине Fish отклоняется от синтаксиса Posix в нескольких важных местах.
- ^ Работа с Linux . Боитесь командной строки? Попробуйте рыбу. Архивировано из оригинала на 2012-07-19.
- ^ «Башенные ловушки» . Проверено 10 июля 2016 .
На этой странице показаны распространенные ошибки, которые допускают программисты на Bash. (…) Вы избавитесь от многих из этих ловушек, если будете просто всегда использовать кавычки и никогда не использовать разделение слов по какой-либо причине! Разделение слов - это устаревшая некорректная функция, унаследованная от оболочки Bourne, которая остается включенной по умолчанию, если вы не цитируете расширения. Подавляющее большинство ловушек так или иначе связано с расширениями без кавычек и последующим разбиением слов и их подстановкой.
- ^ «RFC: добавить привязку для расширения / оценки токенов в командной строке» . 2013-05-16 . Проверено 9 апреля 2021 .
- ^ "printf не поддерживает \ e" . проблемы с рыбой . 11 июля 2013 . Проверено 24 марта 2016 .
Внешние ссылки
- Официальный веб-сайт - содержащая документацию и загрузки
- рыба на GitHub (активный)
- рыба на Gitorious (устарело)
- рыба на SourceForge (устарело)
- Fish-users - общий список для обсуждения для рыбопользователей
- Словарь перевода Shell - еще одна таблица перевода Bash / Fish