Часто задаваемые вопросы
Как задать или очистить переменную среды?
Используйте команду set:
set -x key value set -e key
С версии fish 3.1 вы можете задать переменную среды только для одной команды, используя синтаксис key=value some command, как и в других оболочках. Две строки ниже ведут себя одинаково — в отличие от других оболочек, fish выведет value в обоих случаях:
key=value echo $key begin; set -lx key value; echo $key; end
Как запустить команду при каждом входе в систему? Какой у fish эквивалент .bashrc или .profile?
Отредактируйте файл ~/.config/fish/config.fish, создав его, если он не существует (обратите внимание на ведущую точку).
Как настроить свой приглашающий символ?
Приглашающий символ — это вывод функции fish_prompt. Разместите её в ~/.config/fish/functions/fish_prompt.fish. Например, простым приглашающим символом является:
function fish_prompt
set_color $fish_color_cwd
echo -n (prompt_pwd)
set_color normal
echo -n ' > '
end
Вы также можете использовать инструмент веб-конфигурации fish_config, чтобы предварительно просмотреть и выбрать приглашающий символ из галереи образцов.
Как запустить команду из истории?
Введите часть команды, а затем нажмите клавиши со стрелками ↑ (вверх) или ↓ (вниз), чтобы перейти к совпадениям в истории. Дополнительные стандартные сочетания клавиш включают Control+P (вверх) и Control+N (вниз).
Как запустить подкоманду? Кавычки не работают!
fish использует скобки для подкоманд. Например:
for i in (ls)
echo $i
end
Моя команда (pkg-config) выдаёт свой результат как одну длинную строку?
В отличие от других оболочек, fish разделяет подстановки команд только по символам новой строки, а не по пробелам, табуляции или символам в $IFS.
Это означает, что если вы запустите
echo x(printf '%s ' a b c)x
будет выведено xa b c x, потому что «a b c » используется как одно целое. Но если вы сделаете
echo x(printf '%s\n' a b c)x
будет выведено xax xbx xcx.
В подавляющем большинстве случаев разбиение по пробелам нежелательно, поэтому это улучшение.
Однако иногда, особенно с pkg-config и связанными инструментами, разбиение по пробелам необходимо.
В таких случаях используйте string split " " следующим образом:
g++ example_01.cpp (pkg-config --cflags --libs gtk+-2.0 | string split " ")
Как получить код завершения команды?
Используйте переменную $status. Она заменяет переменную $?, используемую в некоторых других оболочках.
somecommand
if test $status -eq 7
echo "That's my lucky number!"
end
Если вас интересует только успех или неудача, вы можете запустить команду напрямую как условие if:
if somecommand
echo "Command succeeded"
else
echo "Command failed"
end
Или, если вы хотите выполнить одну команду в случае успеха или неудачи первой, используйте and или or.
somecommand or someothercommand
См. документацию для test и if для получения дополнительной информации.
Как проверить, определена ли переменная?
Используйте set -q var. Например, if set -q var; echo variable defined; end. Чтобы проверить несколько переменных, можно объединить их с and и or следующим образом:
if set -q var1; or set -q var2
echo either variable defined
end
Помните, что определённая переменная также может быть пустой, либо не имея элементов (если задана как set var) или содержа лишь пустые элементы (если задана как set var ""). Читайте дальше, чтобы узнать, как с этим справиться.
Как проверить, что переменная не пустая?
Используйте string length -q -- $var. Например, if string length -q -- $var; echo not empty; end. Обратите внимание, что string length будет интерпретировать список нескольких переменных как дизъюнкцию (то есть любая/или):
if string length -q -- $var1 $var2 $var3
echo at least one of these variables is not empty
end
В качестве альтернативы используйте test -n "$var", но помните, что переменная должна быть заключена в двойные кавычки. Например, if test -n "$var"; echo not empty; end. Команда test предоставляет свои собственные и (-a) и или (-o):
if test -n "$var1" -o -n "$var2" -o -n "$var3"
echo at least one of these variables is not empty
end
Если вы хотите узнать, содержит ли переменная никаких элементов, используйте set -q var[1].
Почему set -Ux (экспортированные универсальные переменные) не работают?
Уже существует глобальная переменная с таким же именем.
Переменные среды, такие как EDITOR или TZ, могут быть установлены глобально с помощью set -Ux. Однако, если переменная среды уже установлена до запуска fish (например, скриптами входа или системными администраторами), она импортируется в fish как глобальная переменная. Области видимости переменных области видимости переменных проверяются «изнутри наружу», что означает, что локальные переменные проверяются первыми, затем глобальные и, наконец, универсальные переменные.
Это означает, что глобальное значение имеет приоритет над универсальным.
Чтобы избежать этой проблемы, рассмотрите возможность изменения настроек, которые наследует fish. Если это невозможно, добавьте оператор в свой файл инициализации пользователя файл инициализации пользователя (обычно ~/.config/fish/config.fish):
set -gx EDITOR vim
Как настроить цвета подсветки синтаксиса?
Используйте инструмент веб-конфигурации fish_config или измените переменные среды fish_color.
Как обновить дополнения к страницам справки?
Используйте команду fish_update_completions.
Я случайно ввёл путь к каталогу, и fish сменил каталог. Что произошло?
Если fish не может найти команду с данным именем, и она начинается с '.', '/' или '~', fish проверит, существует ли каталог с таким именем. Если да, предполагается, что вы хотите изменить рабочий каталог. Например, самый быстрый способ перейти в свой домашний каталог — это просто нажать ~ и ввести.
Команда open не работает.
Команда open использует базу данных типов MIME и файлы .desktop, используемые Gnome и KDE, для определения типов файлов и действий по умолчанию. Если по крайней мере одна из этих сред установлена, но команда open не работает, это, вероятно, означает, что соответствующие файлы установлены в нестандартном расположении. Подумайте о поиске дополнительной помощи.
Как сделать fish моей оболочкой по умолчанию?
Если вы установили fish вручную (например, скомпилировав его, а не с помощью менеджера пакетов), сначала необходимо добавить fish в список оболочек, выполнив следующую команду (предполагается, что fish установлен в /usr/local):
echo /usr/local/bin/fish | sudo tee -a /etc/shells
Если вы установили предварительно упакованную версию fish, менеджер пакетов должен был уже сделать это за вас.
Чтобы изменить свою оболочку по умолчанию, введите:
chsh -s /usr/local/bin/fish
Возможно, вам нужно будет изменить указанный выше путь, например, на /usr/bin/fish. Используйте команду which fish если вы не уверены, где установлен fish.
К сожалению, нет способа заставить изменения вступить в силу сразу. Вам нужно будет выйти и снова войти в систему.
У меня появляется странный вывод перед каждым приглашением при использовании screen. В чём проблема?
Быстрый ответ:
Выполните следующую команду в fish:
function fish_title; end; funcsave fish_title
Проблема решена!
Длинный ответ:
Fish пытается установить сообщение в строке заголовка вашего терминала. Хотя сам screen поддерживает эту функцию, ваш терминал нет. К сожалению, когда базовый терминал не поддерживает установку сообщения в строке заголовка, screen просто пропускает коды escape и текст в базовый терминал, вместо того, чтобы их игнорировать. Невозможно обнаружить и решить эту проблему внутри fish, так как fish не может определить тип базового терминала. Пока единственный способ исправить это — сбросить сообщение в строке заголовка, как показано выше.
Обратите внимание, что у fish есть стандартное сообщение в строке заголовка, которое будет использоваться, если функция fish_title не определена. Поэтому простое удаление функции fish_title не сработает.
Как изменить приветствие?
Измените значение переменной fish_greeting или создайте функцию fish_greeting. Например, чтобы удалить приветствие, используйте:
set fish_greeting
Почему не работает замена истории ("!$" и т. д.)?
Потому что замена истории — неуклюжий интерфейс, который был изобретён до того, как стало возможным интерактивное редактирование строк. Fish отказывается от него в пользу совершенствования интерактивного интерфейса вызова истории. Переключение требует небольших изменений привычек: если вы хотите изменить старую строку/слово, сначала вызовите её, а затем отредактируйте. Например, не вводите «sudo !!» — сначала нажмите клавишу Вверх, затем Home, затем введите «sudo ».
Вызов истории в Fish очень прост и эффективен:
- Как и в любой современной оболочке, стрелка вверх ↑ вызывает целые строки, начиная с последней исполненной. Один нажатие заменяет "!!", последующие нажатия заменяют "!-3" и тому подобное.
- Если нужная строка находится далеко в истории, введите любую часть строки, а затем нажмите клавишу Вверх один или несколько раз. Это ограничит вызов строк, содержащих этот текст, и вы быстрее дойдете до нужной строки. Это заменяет "!vi", "!?bar.c" и т.п.
-
Alt+↑,Вверх вызывает отдельные аргументы, начиная с последнего аргумента в последней исполненной строке. Одно нажатие заменяет "!$", последующие нажатия заменяют "!!:4" и т. д. Альтернативное сочетание клавиш — Alt+..
- Если нужный аргумент находится далеко в истории (например, 2 строки назад — это много слов!), введите любую его часть, а затем нажмите Alt+↑,Вверх. Это покажет только аргументы, содержащие эту часть, и вы быстрее получите нужное. Попробуйте, это очень удобно!
- Если вам нужно повторно использовать несколько аргументов из одной строки ("!!:3*" и т. п.), рассмотрите возможность вызова всей строки и удаления ненужного (Alt+D и Alt+Backspace — ваши друзья).
См. документацию для получения дополнительной информации об интерактивном редактировании в fish.
Как я могу использовать - как сокращение для cd -?
В версиях fish до 2.5.0 было возможно создание функции с именем -, которая выполняла cd -. Изменения в релизе 2.5.0 включали несколько исправлений ошибок, которые навязывают правило, что одиночный дефис не является допустимым именем функции (или переменной). Однако, вы можете достичь того же эффекта с помощью сокращения:
abbr -a -- - 'cd -'
Удаление fish
Если вы хотите удалить fish, сначала убедитесь, что fish не установлен в качестве вашей оболочки. Запустите chsh -s /bin/bash , если вы не уверены.
Далее выполните следующие действия (предполагается, что fish был установлен в /usr/local):
rm -Rf /usr/local/etc/fish /usr/local/share/fish ~/.config/fish rm /usr/local/share/man/man1/fish*.1 cd /usr/local/bin rm -f fish fish_indent
Зарезервированные в fish Unicode символы частного использования
Fish резервирует диапазон Unicode символов частного использования от U+F600 до U+F73F для внутреннего использования. Любая попытка ввести символы в этом диапазоне в fish приведет к их замене на Unicode "символ замены" U+FFFD. Это относится как к интерактивному вводу, так и к любому файлу, считанному fish (но не к программам, запускаемым fish).
Где найти дополнительные инструменты для fish?
Пользовательское сообщество fish расширяет fish уникальными и полезными способами с помощью скриптов, которые не всегда подходят для включения в пакет fish. Обычно это потому, что они решают узкоспециализированные проблемы, которые вряд ли заинтересуют широкую аудиторию. Эти расширения, включая подсказки, темы и полезные функции, можно найти в различных сторонних репозиториях. К ним относятся:
Это не исчерпывающий список, и проект fish не имеет мнения относительно достоинств перечисленных выше репозиториев или скриптов, которые в них содержатся.
© 2019 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.1/faq.html