WikiDer > 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.

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