Fish (оболочка Unix) - Fish (Unix shell)

рыбы
Логотип рыбьей раковины ascii.png
Раковина рыбы. Его слоган «рыба - дружественная интерактивная оболочка» отображается вверху.
Раковина рыбы. Его слоган «рыба - дружественная интерактивная оболочка» отображается вверху.
Оригинальный автор (ы)Аксель Лильенкранц
Разработчики)смешная рыба, ситшвар, JanKanis[1]
изначальный выпуск13 февраля 2005 г.; 15 лет назад (2005-02-13)
Стабильный выпуск
3.1.2 / 29 апреля 2020; 7 месяцев назад (2020-04-29)[2]
Репозиторий Отредактируйте это в Викиданных
Операционная системаUnix-подобный
ТипОболочка Unix
ЛицензияGPL v2[3]
Интернет сайтрыбья раковина.com

рыбы это Оболочка 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"  фисделано

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 синий

Другие свойства

Версия 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-последовательность, поэтому требует также экранирования обратной косой черты (за исключением того, что разрешает одиночную обратную косую черту, которая не предшествует другой обратной косой черте или одинарной кавычке).

Смотрите также

Рекомендации

  1. ^ "члены команды рыбных панцирей". GitHub.com. Получено 2013-05-21.
  2. ^ [1] Примечания к выпуску Fish 3.1.2
  3. ^ fishshell.com Лицензия на рыбу
  4. ^ Еженедельные новости Linux. Fish - удобная оболочка. Проверено 24 марта 2010.
  5. ^ Linux.com. CLI Magic: Улучшение панциря рыбой. Проверено 24 марта 2010.
  6. ^ Пол, Райан. «Углубленный взгляд на рыбу: дружественная интерактивная оболочка». Ars Technica. Получено 10 марта 2015. синтаксис Posix имеет несколько отсутствующих или плохо реализованных функций, включая область видимости переменных, массивы и функции. По этой причине Fish отклоняется от синтаксиса Posix в нескольких важных местах.
  7. ^ Работа с Linux. Боитесь командной строки? Попробуйте рыбу. Архивировано из оригинал 19 июля 2012 г.
  8. ^ "Башенные ловушки". Получено 2016-07-10. На этой странице показаны распространенные ошибки, которые допускают программисты на Bash. (…) Вы избавитесь от многих из этих ловушек, если будете просто всегда использовать кавычки и никогда не использовать разделение слов по какой-либо причине! Разделение слов - это устаревшая некорректная функция, унаследованная от оболочки Bourne, которая остается включенной по умолчанию, если вы не цитируете расширения. Подавляющее большинство ловушек так или иначе связано с расширениями без кавычек и последующим разделением слов и глобализацией.
  9. ^ "printf не поддерживает e". проблемы с рыбой. 11 июл 2013. Получено 24 марта 2016.

внешняя ссылка