Fish (оболочка Unix) - Fish (Unix shell)
Эта статья нужны дополнительные цитаты для проверка.Май 2019) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Раковина рыбы. Его слоган «рыба - дружественная интерактивная оболочка» отображается вверху. | |
Оригинальный автор (ы) | Аксель Лильенкранц |
---|---|
Разработчики) | смешная рыба, ситшвар, JanKanis[1] |
изначальный выпуск | 13 февраля 2005 г. |
Стабильный выпуск | 3.1.2 / 29 апреля 2020[2] |
Репозиторий | |
Операционная система | Unix-подобный |
Тип | Оболочка Unix |
Лицензия | GPL v2[3] |
Интернет сайт | рыбья раковина |
рыбы это Оболочка Unix который пытается быть более интерактивным и удобным для пользователя, чем те, которые имеют более длительную историю (например, большинство других оболочек Unix), или те, которые сформулированы как функционально-совместимые замены для вышеупомянутых (например, zsh, оболочка Фальстада). Цель дизайна Fish - предоставить пользователю богатый набор мощных функций, которые можно легко обнаружить, запомнить и использовать.[4] рыба считается "экзотическая оболочка ",[нужна цитата ] в том, что его синтаксис не является производным Оболочка Борна (кш, Баш, zsh ), ни оболочка C (csh, tcsh ). Также, в отличие от предыдущих оболочек, которые по умолчанию отключают определенные функции для экономии системных ресурсов, fish по умолчанию включает все функции.
Особенности
Рыба "ищи по мере ввода " автоматические предложения на основе истории и текущего каталога. По сути, это похоже на Bash Ctrl+р поиск по истории, но поскольку он всегда включен, а не является отдельным режимом, пользователь получает непрерывную обратную связь при написании командной строки и может выбирать предложения с помощью клавиш со стрелками или, как в Bash, нажимать Вкладка ↹ вместо этого для завершения табуляции. Завершение табуляции многофункциональный, расширяющий пути к файлам (с подстановочные знаки и расширение скобки ), переменные и многие дополнения для конкретных команд. Завершение для конкретных команд, включая параметры с описаниями, в некоторой степени можно сгенерировать из справочных страниц команд.
Fish имеет несколько синтаксических правил, предпочитая функции в виде команд, а не синтаксиса. Это делает особенности обнаруживаемый с точки зрения команд с опциями и справочными текстами. Функции также может содержать понятное для человека описание. Специальный помощь команда предоставляет доступ ко всей документации по рыбам в пользовательском веб-браузер.[5]
Синтаксис
Синтаксис напоминает POSIX совместимая оболочка (например, Bash), но имеет важные отличия, в которых создатели считают, что оболочка POSIX была плохо спроектирована.[6]
# Присваивание переменной, установите переменную 'foo' в # значение 'bar'. Fish не использует оператор =, поскольку # он изначально чувствителен к пробелам. Также набор Команда # легко расширяется для работы с массивами, областью видимости и т. д.> набор foo bar> эхо $ fooбар # Подстановка команды, назначить вывод команды # 'pwd' в переменную 'wd'. Рыба не использует '' # поскольку они не могут быть вложенными и слишком похожи на ''. # Не используйте $ (), поскольку $ используется только для переменной # расширение в fish.> набор wd (pwd)> эхо $ wd~# Массив переменных. 'A' становится массивом с 5 значениями:> набор А 3 5 7 9 12# Нарезка массива. «B» становится первыми двумя элементами «A»:> набор B $ A[1 2]> эхо $ Млрд3 5# Вы можете индексировать с другими массивами и даже командой # вывод подстановки:> эхо $ A[(seq 3)]3 5 7# Сотрите третий и пятый элементы 'A'> набор - стереть A[$ Млрд]> эхо $ A3 5 9# for-loop, конвертировать jpeg в png> за я в * .jpg преобразовать $ i (базовое имя $ i .jpg).png конец# Точки с запятой работают как символы новой строки:> за я в * .jpg; конвертировать $ i (базовое имя $ i .jpg).png; конец# но многострочную форму удобно использовать, потому что # fish поддерживает многострочную историю и редактирование.# цикл while, чтение строк / etc / passwd и вывод пятого # поле файла, разделенное двоеточиями. Это должно быть# описание пользователя.> пока читать линия набор обр (эхо $ линия|tr: п) эхо $ arr[5] конец < / etc / passwd
Нет неявной подоболочки
Некоторые языковые конструкции, например трубопроводы, функции и петли, были реализованы с использованием так называемых подоболочек в других ракушка языков. Подоболочки - это просто дочерние программы, которые запускают несколько команд для оболочки и затем завершают работу. К сожалению, эта деталь реализации обычно имеет побочный эффект, заключающийся в том, что любые изменения состояния, сделанные в подоболочке, такие как присвоение переменных, не распространяются на основную оболочку, что может удивить пользователя. Рыба никогда не разветвляет так называемые подоболочки; все встроенные функции всегда полностью функциональны.
# Это не будет работать во многих других оболочках, поскольку встроенная функция 'read'# будет работать в собственной подоболочке. В Баше правая часть трубы# не может иметь побочных эффектов. В ksh команда ниже работает, но# левая сторона не может иметь побочных эффектов. В fish и zsh оба# стороны могут иметь побочные эффекты.> cat * .txt | читать линия
Пример присвоения переменной
Этот пример Bash не делает того, что выглядит: поскольку тело цикла является подоболочкой, обновление до $ найдено
не является стойким.
найденный=''кот / etc / fstab | пока читать dev mnt отдых; делать если тест "$ млн" = "/"; тогда найденный="$ dev" фисделано
Обходной путь:
найденный=''пока читать dev mnt отдых; делать если тест "$ млн" = "/"; тогда найденный="$ dev" фисделано etc / fstab
Fish не требует обходного пути:
набор найденный ''кот / etc / fstab | пока читать dev mnt отдых если тест "$ млн" = "/" набор найденный $ dev конецконец
Полезные сообщения об ошибках
Сообщения об ошибках в fish предназначены для того, чтобы фактически сообщить пользователю, что пошло не так и что с этим можно сделать.[7]
> фу=барfish: Неизвестная команда «foo = bar». Вы имели в виду «установить ПЕРЕМЕННОЕ ЗНАЧЕНИЕ»?Для получения информации о настройке значений переменных см. Раздел справки накоманду set, набрав «help set».> эхо ${фу}барfish: Вы имели в виду {$ VARIABLE}? Символ '$' начинает переменнуюимя. Скобка, следующая сразу за символом "$", не допускается в качествечасть имени переменной, а имена переменных не могут состоять из нулевых символовдлинный. Чтобы узнать больше о расширении переменных в fish, введите «helpрасширять-переменную ».> эхо $(pwd)рыба: Вы имели в виду (КОМАНДА)? В fish используется только символ '$'для доступа к переменным. Чтобы узнать больше о подстановке команд врыба, введите «help expand-command-substitution».
Универсальные переменные
Fish имеет функцию, известную как универсальные переменные, которая позволяет пользователю постоянно присваивать значение переменной для всех запущенных рыбных панцирей. Значение переменной запоминается при выходе из системы и перезагрузке, а обновления немедленно распространяются на все запущенные оболочки.
# Это сделает emacs текстовым редактором по умолчанию. '--Universal' (или '-U') сообщает рыбе, что# сделать эту переменную универсальной.> набор - Универсальный РЕДАКТОР emacs# Эта команда сделает текущий рабочий каталог частью рыбы# подсказка становится синей на всех запущенных экземплярах рыбы.> набор --universal fish_color_cwd синий
Другие свойства
- Расширенное завершение вкладки.
- Подсветка синтаксиса с обширной проверкой ошибок.
- Поддержка Икс буфер обмена.
- Умная Терминал обработка на основе terminfo.
- С возможностью поиска история команд.
Версия 2 добавляет:
- Самовнушения
- 256 цветов терминала
- Конфигурация через Интернет
- Повышена производительность (за счет большего количества встроенных функций).
Таблица перевода bash / fish
Особенность | Синтаксис Bash | синтаксис рыбы | Комментарий |
---|---|---|---|
расширение переменной: с разделением слов и шарик интерпретация | $ var или же $ {var [@]} или же $ {var [*]} | намеренно опущен | Определен как основная причина ошибок в языках оболочки, совместимых с posix[8] |
расширение переменной: скаляр | "$ var" | намеренно опущен | Каждая переменная - это массив |
расширение переменной: множество | "$ {var [@]}" | $ var | Цитирование не обязательно для подавления разбиения слов и интерпретации глобусов Вместо этого цитирование означает сериализацию. |
расширение переменной: как строка, разделенная пробелами | "$ {var [*]}" | "$ var" | |
завершение истории | Ctrl+р | скрытый | |
подмена истории | !! | намеренно опущен | Не обнаруживается |
явная подоболочка | (выражение) | рыба -c выражение | |
подстановка команд | "$ (выражение)" | (выражение) | |
замена процесса | <(выражение) | (выражение | psub) | Команда, а не синтаксис |
логические операторы | ! cmd && эхо ПРОВАЛ || эхо Ok | нет командаи эхо ПРОВАЛили же эхо Ok | |
присвоение переменной | var = значение | набор значение var | |
обработка строки: заменять | "$ {HOME / alice / bob}" | строка replace alice bob $ HOME | |
обработка строки: удалить префикс или суффикс, не жадно или не жадно | вар=a.b.c"${вар#*.}" #до н.э"${вар##*.}" #c"${вар%.*}" # a.b"${вар%%.*}" #a | заменить строку --regex '.*?\.(.*)' '$1' a.b.c #до н.эзаменить строку --regex '.*\.(.*)' '$1' a.b.c #cзаменить строку --regex '(.*)\..*' '$1' a.b.c # a.bзаменить строку --regex '(.*?)\..*' '$1' a.b.c #a | |
экспортная переменная | экспорт var | установить --export var | Параметры, доступные через завершение вкладки |
локальная переменная функции | местный вар | по умолчанию | |
локальная переменная области видимости | нет эквивалента | установить --local var | |
удалить переменную | unset var | set --erase var | |
проверьте, существует ли переменная | test -v var | set --query var | |
инициализация массива | var = (а б в) | набор вар а б в | Каждая переменная - это массив |
итерация массива | за я в "${вар[@]}"; делать эхо "$ i"сделано | за я в $ var эхо $ iконец | |
вектор аргумента: все аргументы | "$@" | $ argv | |
вектор аргумента: индексация | "$1" | $ argv [1] | |
вектор аргумента: длина | $# | (количество $ argv) | |
вектор аргумента: сдвиг | сдвиг | набор - стереть argv[1] | |
представление массива в переменных среды | ДОРОЖКА="$ PATH:$ HOME/.local/bin " | набор ДОРОЖКА $ 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' | е | printf ' e' работает в обеих оболочках; их printf обе встроенные команды совместимы с GNU printf автономная программа.[9] |
одинарная строка в кавычках: escape-последовательности | 'Мама'\'последняя обратная косая черта: ' | 'Мама\'последняя обратная косая черта: \\' | Bash требует замены только одинарной кавычки в одинарных кавычках, но длина замены составляет 4 символа. Та же замена работает в fish, но fish поддерживает для этого обычную escape-последовательность, поэтому требует также экранирования обратной косой черты (за исключением того, что разрешает одиночную обратную косую черту, которая не предшествует другой обратной косой черте или одинарной кавычке). |
Смотрите также
Рекомендации
- ^ "члены команды рыбных панцирей". GitHub.com. Получено 2013-05-21.
- ^ [1] Примечания к выпуску Fish 3.1.2
- ^ fishshell.com Лицензия на рыбу
- ^ Еженедельные новости Linux. Fish - удобная оболочка. Проверено 24 марта 2010.
- ^ Linux.com. CLI Magic: Улучшение панциря рыбой. Проверено 24 марта 2010.
- ^ Пол, Райан. «Углубленный взгляд на рыбу: дружественная интерактивная оболочка». Ars Technica. Получено 10 марта 2015.
синтаксис Posix имеет несколько отсутствующих или плохо реализованных функций, включая область видимости переменных, массивы и функции. По этой причине Fish отклоняется от синтаксиса Posix в нескольких важных местах.
- ^ Работа с Linux. Боитесь командной строки? Попробуйте рыбу. Архивировано из оригинал 19 июля 2012 г.
- ^ "Башенные ловушки". Получено 2016-07-10.
На этой странице показаны распространенные ошибки, которые допускают программисты на Bash. (…) Вы избавитесь от многих из этих ловушек, если будете просто всегда использовать кавычки и никогда не использовать разделение слов по какой-либо причине! Разделение слов - это устаревшая некорректная функция, унаследованная от оболочки Bourne, которая остается включенной по умолчанию, если вы не цитируете расширения. Подавляющее большинство ловушек так или иначе связано с расширениями без кавычек и последующим разделением слов и глобализацией.
- ^ "printf не поддерживает e". проблемы с рыбой. 11 июл 2013. Получено 24 марта 2016.
внешняя ссылка
- Официальный веб-сайт - содержащая документацию и загрузки
- рыбы на GitHub (активный)
- рыбы на Великолепный (устаревший)
- рыбы на SourceForge (устаревший)
- Рыболовы - общий список обсуждения для пользователей рыбы
- Словарь переводов Shell - еще одна таблица перевода Bash / Fish