Spec-Zone.ru › Fish 3.2

Часто задаваемые вопросы

Какой эквивалент этой вещи из bash (или других оболочек)?

См. Fish для пользователей bash

Как установить или очистить переменную среды?

Используйте команду set:

set -x key value # typically set -gx 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

Обратите внимание, что «exported» не является областью видимости, а дополнительной частью состояния. Переменная может быть глобальной и экспортированной, локальной и экспортированной или даже универсальной и экспортированной. Обычно имеет смысл делать экспортированную переменную глобальной.

Как проверить, определена ли переменная?

Используйте 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 .bashrc или .profile?

Отредактируйте файл ~/.config/fish/config.fish [1], создав его, если он не существует (обратите внимание на предшествующую точку).

[1] Часть "~/.config" может быть установлена через $XDG_CONFIG_HOME, это просто значение по умолчанию.

Как настроить свой приглашающий символ?

Приглашающий символ — это вывод функции 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, чтобы просмотреть и выбрать из галереи образцов приглашающих символов.

Если вы хотите изменить существующий приглашающий символ, вы можете использовать funced и funcsave, например:

>_ funced fish_prompt
# This opens up your editor (set in $EDITOR).
# Modify the function,
# save the file and repeat to your liking.
# Once you are happy with it:
>_ funcsave fish_prompt

Это также относится к fish_right_prompt и fish_mode_prompt.

Почему в моём приглашающем символе отображается [I]?

Это fish_mode_prompt. Он отображается по умолчанию, когда вы активировали режим vi с помощью fish_vi_key_bindings.

Если вы не активировали режим vi намеренно, возможно, вы установили стороннюю тему, которая это делает.

Если вы хотите изменить или отключить это отображение, измените функцию fish_mode_prompt, например, с помощью funced.

Как настроить цвета подсветки синтаксиса?

Используйте веб-инструмент для конфигурации, fish_config, или измените семейство переменных среды fish_color.

Как изменить приветственное сообщение?

Измените значение переменной fish_greeting или создайте функцию fish_greeting. Например, чтобы удалить приветствие, используйте:

set -U fish_greeting

Или, если вы предпочитаете не использовать универсальную переменную, используйте:

set -g fish_greeting

в config.fish.

У меня появляется странный вывод перед каждым приглашением при использовании screen. В чём проблема?

Быстрый ответ:

Выполните следующую команду в fish:

function fish_title; end; funcsave fish_title

Проблема решена!

Подробный ответ:

Fish пытается установить сообщение в строке заголовка вашего терминала. Хотя сам screen поддерживает эту функцию, ваш терминал нет. К сожалению, когда базовый терминал не поддерживает установку строки заголовка, screen просто пропускает escape-коды и текст базовому терминалу вместо их игнорирования. Невозможно обнаружить и решить эту проблему изнутри fish, так как у fish нет способа определить тип базового терминала. На данный момент единственный способ исправить это — сбросить сообщение в строке заголовка, как указано выше.

Обратите внимание, что у fish есть сообщение в строке заголовка по умолчанию, которое будет использоваться, если функция fish_title не определена. Таким образом, простое удаление функции fish_title не сработает.

Как запустить команду из истории?

Введите часть команды, а затем нажмите клавишу ↑ (вверх) или ↓ (вниз), чтобы перемещаться по совпадениям в истории. Дополнительные стандартные сочетания клавиш включают Control+P (вверх) и Control+N (вниз).

Почему не работает замена истории ("!$" и т. д.)?

Потому что замена истории — это неудобный интерфейс, созданный до того, как стала возможной интерактивная правка строки. Вместо добавления этого псевдосинтаксиса fish предлагает удобные функции поиска и восстановления истории. Для переключения необходимо немного изменить привычки: если вы хотите изменить старую строку/слово, сначала восстановите её, а затем отредактируйте.

В качестве частного случая, в большинстве случаев замена истории используется как sudo !!. В этом случае просто нажмите Alt+S, и она восстановит вашу последнюю командную строку с префиксом sudo (или переключит префикс sudo в текущей командной строке, если что-то есть).

В общем, восстановление истории в fish работает так:

  • Как и в других оболочках, клавиша Up, ↑, вызывает целые строки, начиная с последней выполненной строки. Одно нажатие заменяет "!!", последующие нажатия заменяют "!-3" и тому подобное.
  • Если нужная строка находится далеко в истории, введите любую часть строки, а затем несколько раз нажмите клавишу Up. Это отфильтрует строки для вывода только тех, которые включают этот текст, и вы быстрее дойдете до нужной строки. Это заменяет "!vi", "!?bar.c" и тому подобное.
  • Alt+↑ вызывает отдельные аргументы, начиная с последнего аргумента в последней выполненной строке. Одно нажатие заменяет "!$", последующие нажатия заменяют "!!:4" и т. д. В качестве альтернативного сочетания клавиш можно использовать Alt+..
  • Если нужный аргумент находится далеко в истории (например, 2 строки назад — это много слов!), введите любую часть аргумента, а затем нажмите Alt+↑. Это отобразит только аргументы, содержащие эту часть, и вы быстрее получите то, что вам нужно. Попробуйте, это очень удобно!
  • Если вы хотите повторно использовать несколько аргументов из одной строки ("!!:3*" и тому подобное), рассмотрите возможность восстановления всей строки и удаления ненужного (Alt+D и Alt+Backspace — ваши друзья).

См. документацию для получения дополнительной информации о редактировании строк в fish.

Как запустить подкоманду? Кавычки не работают!

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 -n " " следующим образом:

g++ example_01.cpp (pkg-config --cflags --libs gtk+-2.0 | string split -n " ")

%% -n пустые элементы удаляются, как это делают оболочки POSIX.

Как получить код возврата команды?

Используйте переменную $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 для получения дополнительной информации.

Моя команда выводит "Нет совпадений для шаблона", но работает в bash

Короче: цитировать или экранировать символ подстановки:

scp user@ip:/dir/"string-*"

Когда fish видит нецитированный *, он выполняет расширение шаблонов. Это означает, что он пытается сопоставить имена файлов с заданной строкой.

Если шаблон не соответствует никаким файлам, fish выводит ошибку вместо выполнения команды:

> echo *this*does*not*exist
fish: No matches for wildcard '*this*does*not*exist'. See `help expand`.
echo *this*does*not*exist 2>| xsel --clipboard
     ^

Теперь bash также пытается сопоставить файлы в этом случае, но если он не находит совпадения, он передает литеральную строку шаблона вместо неё.

Это означает, что команды, подобные приведенным выше

scp user@ip:/dir/string-*

или

apt install postgres-*

кажутся работающими, потому что в большинстве случаев строка не соответствует шаблону, и поэтому он передаёт string-*, которая затем интерпретируется принимающей программой.

Но это также означает, что эти команды могут перестать работать в любой момент, как только будет найден соответствующий файл (потому что он был создан или команда выполняется в другой рабочей директории), и для обработки этого bash нужны обходные пути, такие как

for f in ./*.mpg; do
      # We need to test if the file really exists because
      # the wildcard might have failed to match.
      test -f "$f" || continue
      mympgviewer "$f"
done

(из http://mywiki.wooledge.org/BashFAQ/004)

По этим причинам fish не делает этого и ожидает, что звёздочки будут цитированы или экранированы, если они не должны быть расширены.

Это аналогично опции «failglob» bash.

Я случайно ввёл путь к каталогу, и fish сменил каталог. Что произошло?

Если fish не может найти команду с заданным именем, и она начинается с ., / или ~, fish проверит, существует ли каталог с таким именем. Если он существует, подразумевается, что вы хотите изменить рабочую директорию. Например, самый быстрый способ перейти в домашний каталог — нажать ~ и нажать Enter.

Как я могу использовать - в качестве сокращения для cd -?

В версиях fish до 2.5.0 было возможно создать функцию с именем -, которая бы выполняла cd -. Изменения в релизе 2.5.0 включали несколько исправлений ошибок, которые обеспечивают правило, что одиночный дефис не является допустимым именем функции (или переменной). Однако вы можете добиться того же эффекта с помощью аббревиатуры:

abbr -a -- - 'cd -'

Команда open не работает.

Команда open использует базу данных типов MIME и файлы .desktop, используемые Gnome и KDE для определения типов файлов и действий по умолчанию. Если по крайней мере одна из этих сред установлена, но команда open не работает, это, вероятно, означает, что соответствующие файлы установлены в нестандартном месте. Рассмотрите возможность попросить дополнительной помощи. .. _faq-ssh-interactive:

Почему SSH/SCP/rsync не подключаются должным образом, когда fish является моей оболочкой входа?

Эта проблема может проявляться в сообщениях, таких как «Received message too long», «open terminal failed: not a terminal», «Bad packet length» или «Connection refused» со странным выводом в ssh_exchange_identification сообщениях в журнале отладки.

Эти проблемы, как правило, вызваны файлом инициализации пользователя файлом инициализации пользователя (обычно ~/.config/fish/config.fish), который генерирует вывод при запуске в неинтерактивном режиме.

Все утверждения в файлах инициализации, которые выводят информацию в терминал, должны быть защищены чем-то вроде следующего:

if status is-interactive
  ...
end

У меня появляются странные графические артефакты (эффект лестницы, призрачные символы ...)?

В терминале приложение, работающее внутри него, и сам терминал должны согласоваться по ширине символов, чтобы обработать перемещение курсора.

Это более важно для fish, чем для других оболочек, поскольку такие функции, как подсветка синтаксиса и автодополнение, реализуются путём перемещения курсора.

Иногда возникает несогласованность по ширине. Причин и решений этому много:

  • Возможны, что символ слишком нов для вашей системы, чтобы его знать — в этом случае вам следует воздержаться от его использования.
  • Fish или ваш терминал могут не знать о символе или обработать его неправильно — в этом случае fish или ваш терминал необходимо исправить, или вам нужно обновиться до исправленной версии.
  • У символа есть «неопределённая» ширина, и fish думает, что это X, а ваш терминал — Y. В этом случае вам либо нужно изменить конфигурацию терминала, либо установить $fish_ambiguous_width на правильное значение.
  • Символ является эмодзи, и хост-система поддерживает только Unicode 8, в то время как вы работаете с терминалом на системе, использующей Unicode ≥ 9. В этом случае установите $fish_emoji_width в 2.

Это также означает, что некоторые вещи не поддерживаются:

  • Шрифты с нефиксированной шириной — никаким образом fish не может определить ширину конкретного символа, так как он не влияет на рендеринг шрифта терминала.
  • Разные ширины для нескольких символов с неопределённой шириной — fish не может знать, какую ширину вы присваиваете каждому символу.

Как установить 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.

К сожалению, нет способа сделать изменения немедленно эффективными. Вам нужно будет выйти и снова войти в систему.

Удаление 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?

Сообщество пользователей fish расширяет fish уникальными и полезными способами с помощью скриптов, которые не всегда подходят для включения в пакет fish. Как правило, потому что они решают узкоспециализированные задачи, которые вряд ли заинтересуют широкую аудиторию. Эти расширения, включая подсказки, темы и полезные функции, можно найти в различных сторонних репозиториях. К ним относятся:

  • Fisher
  • Fundle
  • Oh My Fish
  • Tacklebox

Это неполный список, и проект fish не имеет мнения относительно достоинств указанных выше репозиториев или скриптов, которые в них содержатся.

© 2020 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.2/faq.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API