Рыба (оболочка Unix)
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Оригинальный автор(ы) | Аксель Лильенкранц |
---|---|
Разработчик(и) | Разработчики рыбьей ракушки [1] |
Первоначальный выпуск | 13 февраля 2005 г |
Стабильная версия | 3.7.1 [2] / 19 марта 2024 г |
Репозиторий | |
Написано в | Ржавчина |
Операционная система | Unix-подобный |
Тип | оболочка Unix |
Лицензия | Только GPL-2.0 [3] |
Веб-сайт | рыбья ракушка |
Fish (стилизовано строчными буквами) — это оболочка Unix , ориентированная на интерактивность и удобство использования. Fish спроектирован как многофункциональный, а не легко настраиваемый. [4] Fish считается экзотической оболочкой , поскольку она не соответствует стандартам оболочки POSIX по усмотрению ее сопровождающих. [5]
Основные моменты
[ редактировать ]Fish имеет поиск по мере ввода автоматических предложений на основе истории и текущего каталога. Это работает как Bash Ctrl+ R поиск по истории, но всегда включен, обеспечивая пользователю постоянную обратную связь при написании командной строки. Пользователи могут выбирать предложения с помощью клавиш со стрелками или, как в Bash, нажимать Tab ↹ вместо этого для завершения табуляции. Заполнение с помощью табуляции обладает множеством функций и имеет расширяемые пути к файлам (с подстановочными знаками и скобками ), переменные и множество дополнений, специфичных для команд. команд Завершения, специфичные для команды, включая параметры с описаниями, которые в некоторой степени могут быть созданы на страницах руководства .
Создатель Fish предпочитал создавать функции в виде команд, а не синтаксиса. Это сделало функции обнаруживаемыми с помощью команд с опциями и справочных текстов. Функции также могут иметь удобочитаемое описание. Специальная команда справки пользователя предоставляет доступ ко всей документации по рыбам в веб-браузере . [6]
Синтаксис
[ редактировать ]Синтаксис напоминает POSIX- совместимую оболочку (например, Bash), но во многом отличается от нее. [7]
# Variable assignment## Set the variable 'foo' to the value 'bar'. # Fish doesn't use the = operator, which is inherently whitespace sensitive. # The 'set' command extends to work with arrays, scoping, etc.> set foo bar> echo $foobar # Command substitution## Assign the output of the command 'pwd' into the variable 'wd'. # Fish doesn't use backticks (``), which can't be nested and may be confused with single quotes (' '). > set wd (pwd)> set wd $(pwd) # since version 3.4> echo $wd~# Array variables. 'A' becomes an array with 5 values:> set A 3 5 7 9 12# Array slicing. 'B' becomes the first two elements of 'A':> set B $A[1 2]> echo $B3 5# You can index with other arrays and even command # substitution output:> echo $A[(seq 3)]3 5 7# Erase the third and fifth elements of 'A'> set --erase A[$B]> echo $A3 5 9# for-loop, convert jpegs to pngs> for i in *.jpg convert $i (basename $i .jpg).png end# fish supports multi-line history and editing.# Semicolons work like newlines:> for i in *.jpg; convert $i (basename $i .jpg).png; end# while-loop, read lines /etc/passwd and output the fifth # colon-separated field from the file. This should be# the user description.> while read line set arr (echo $line|tr : \n) echo $arr[5] end < /etc/passwd# String replacement (replacing all i by I)> string replace -a "i" "I" "Wikipedia"WIkIpedIa
Нет неявной подоболочки
[ редактировать ]Некоторые языковые конструкции, такие как конвейеры , функции и циклы , были реализованы с использованием так называемых подоболочек в других языках оболочки . Подоболочки — это дочерние программы, которые запускают несколько команд оболочки и затем завершают работу. Эта деталь реализации обычно имеет побочный эффект: любые изменения состояния, сделанные в подоболочке, например назначение переменных, не распространяются на основную оболочку. Рыба никогда не отделяет так называемые подоболочки; все встроенные функции всегда полностью функциональны.
# This will not work in many other shells, since the 'read' builtin# will run in its own subshell. In Bash, the right side of the pipe# can't have any side effects. In ksh, the below command works, but# the left side can't have any side effects. In fish and zsh, both# sides can have side effects.> cat *.txt | read line
Пример назначения переменной
[ редактировать ]Этот пример Bash не делает то, что кажется: поскольку тело цикла является подоболочкой, обновление $found
не является настойчивым.
found=''cat /etc/fstab | while read dev mnt rest; do if test "$mnt" = "/"; then found="$dev" fidone
Обходной путь:
found=''while read dev mnt rest; do if test "$mnt" = "/"; then found="$dev" fidone < /etc/fstab
Пример рыбы:
set found ''cat /etc/fstab | while read dev mnt rest if test "$mnt" = "/" set found $dev endend
Универсальные переменные
[ редактировать ]Fish имеет функцию, известную как универсальные переменные, которая позволяет пользователю постоянно присваивать значение переменной во всех запущенных пользователем оболочках Fish. Значение переменной запоминается при выходе из системы и перезагрузке, а обновления немедленно распространяются на все запущенные оболочки.
# This will make emacs the default text editor. The '--universal' (or '-U') tells fish to# make this a universal variable.> set --universal EDITOR emacs# This command will make the current working directory part of the fish# prompt turn blue on all running fish instances.> set --universal fish_color_cwd blue
Другие особенности
[ редактировать ]- Расширенное заполнение вкладки.
- Подсветка синтаксиса с расширенной проверкой ошибок.
- Поддержка X. обмена буфера
- Интеллектуальная обработка терминалов на основе terminfo .
- с возможностью поиска История команд .
- Конфигурация через веб-интерфейс.
Таблица перевода Bash/fish
[ редактировать ]Особенность | Синтаксис Баша | синтаксис рыбы | Комментарий |
---|---|---|---|
переменное расширение: с разделением слов и глобальной интерпретацией | $var или ${var[@]} или ${var[*]} | намеренно опущен | Идентифицирован как основная причина ошибок в posix-совместимых языках оболочки. [8] |
переменное расширение: скаляр | "$var" | намеренно опущен | Каждая переменная представляет собой массив |
переменное расширение: множество | "${var[@]}" | $var | Цитирование не обязательно для подавления разделения слов и интерпретации. Вместо этого цитирование означает сериализацию. |
переменное расширение: как строка, разделенная пробелами | "${var[*]}" | "$var" | |
редактировать строку в текстовом редакторе | Ctrl+ X, Ctrl+ E | Alt+ E | При вызове перемещает ввод строки в текстовый редактор. |
оценить линейный ввод | Ctrl+ Alt+ E | — [9] | Оценивает выражения прямо в редакторе строк. |
завершение истории | Ctrl+ R | скрытый | |
подмена истории | !! | намеренно опущен | Не обнаруживается |
явная подоболочка | (expression) | fish -c expression | |
замена команды | "$(expression)" |
| |
замена процесса | <(expression) | (expression | psub) | Команда, а не синтаксис |
логические операторы | !cmd && echo FAIL || echo OK | not commandand echo FAILor echo OK | |
присвоение переменной | var=value | set var value | |
обработка строк: заменять | "${HOME/alice/bob}" | string replace alice bob $HOME | |
обработка строк: удалить шаблон префикса или суффикса, не жадно или жадно | var=a.b.c"${var#*.}" #b.c"${var##*.}" #c"${var%.*}" #a.b"${var%%.*}" #a | string replace --regex '.*?\.(.*)' '$1' a.b.c #b.cstring replace --regex '.*\.(.*)' '$1' a.b.c #cstring replace --regex '(.*)\..*' '$1' a.b.c #a.bstring replace --regex '(.*?)\..*' '$1' a.b.c #a | |
экспортировать переменную | export var | set --export var | Параметры, доступные через завершение вкладки |
локальная переменная функции | local var | по умолчанию | |
локальная переменная области видимости | нет эквивалента | set --local var | |
удалить переменную | unset var | set --erase var | |
проверьте, существует ли переменная | test -v var | set --query var | |
инициализация массива | var=( a b c ) | set var a b c | Каждая переменная представляет собой массив |
итерация массива | for i in "${var[@]}"; do echo "$i"done | for i in $var echo $iend | |
вектор аргумента: все аргументы | "$@" | $argv | |
вектор аргумента: индексирование | "$1" | $argv[1] | |
вектор аргумента: длина | $# | (count $argv) | |
вектор аргумента: сдвиг | shift | set --erase argv[1] | |
представление массива в переменных среды | PATH="$PATH:$HOME/.local/bin" | set 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)) | math '10/3' | expr 10 / 3 работает в любой оболочке, поскольку expr — это отдельная программа. |
escape-последовательность | $'\e' | \e | printf '\e' работает в обеих оболочках; их printf обе встроенные функции совместимы с GNU printf автономная программа. [10] |
строка в одинарных кавычках: escape-последовательности | 'mom'\''s final backslash: \' | 'mom\'s final backslash: \\' | Bash требует замены только самой одинарной кавычки в строках с одинарными кавычками, но длина замены составляет 4 символа. Та же замена работает и в fish, но fish поддерживает для этого обычную escape-последовательность, поэтому требует также экранирования обратной косой черты (за исключением того, что разрешены одинарные обратные косые черты, которые не предшествуют другой обратной косой черте или одинарной кавычке). |
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «члены команды рыбных панцирей» . GitHub.com . Проверено 28 июля 2021 г.
- ^ «Выпуск 3.7.1» . 19 марта 2024 г. Проверено 22 марта 2024 г.
- ^ fishshell.com Лицензия на рыбу.
- ^ Лильенкранц, Аксель (17 мая 2005 г.). «Рыба — Удобная ракушка» . Еженедельные новости Linux . Проверено 24 марта 2010 г.
- ^ «Рыбная документация: дизайн» . Проверено 9 апреля 2021 г.
- ^ Linux.com . CLI Magic: Усиление оболочки рыбой. Проверено 24 марта 2010 г.
- ^ Пол, Райан (19 декабря 2005 г.). «Углубленный взгляд на рыбу: дружелюбная интерактивная раковина» . Арс Техника . Проверено 10 марта 2015 г.
синтаксис Posix имеет несколько отсутствующих или плохо реализованных функций, включая область видимости переменных, массивы и функции. По этой причине fish отклоняется от синтаксиса Posix в нескольких важных местах.
- ^ «Ловушки Баша» . Проверено 10 июля 2016 г.
На этой странице показаны распространенные ошибки, которые допускают программисты Bash. (…) Вы убережете себя от многих из этих ловушек, если просто всегда будете использовать кавычки и никогда ни по какой причине не будете использовать разделение слов! Разделение слов — это сломанная устаревшая функция, унаследованная от оболочки Bourne, которая остается включенной по умолчанию, если вы не указываете расширения. Подавляющее большинство ошибок так или иначе связано с расширениями без кавычек и последующим разделением и подстановкой слов в результате.
- ^ «RFC: добавить привязку для раскрытия/оценки токенов в командной строке» . Гитхаб . 16 мая 2013 г. Проверено 9 апреля 2021 г.
- ^ «printf не поддерживает \e» . проблемы с рыбой . 11 июля 2013 г. Проверено 24 марта 2016 г.
Внешние ссылки
[ редактировать ]- Официальный сайт – содержит документацию и файлы для загрузки
- рыба на GitHub (активна)
- рыба на Гиториусе (устарело)
- рыба на SourceForge (устарело)
- Пользователи рыбы – общий список обсуждений для пользователей рыбы.
- Shell Translation Dictionary — еще одна таблица перевода Bash/Fish