Spec-Zone.ru › Fish 3.6

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

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

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

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

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

Поскольку в fish 3.1 вы можете установить переменную среды только для одной команды, используя синтаксис key=value some command, как в других оболочках. Две строки ниже ведут себя одинаково — в отличие от других оболочек, fish выведет value в обоих случаях:

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

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

Используйте set -q var. Например, if set -q var; echo variable defined; end. Для проверки нескольких переменных можно объединить с and и or следующим образом:

Помните, что определённая переменная также может быть пустой, либо не имея элементов (если установлена как set var) или содержа только пустые элементы (если установлена как set var ""). Продолжайте читать, чтобы узнать, как с этим справиться.

Как проверить, что переменная не пуста?

Используйте string length -q -- $var. Например, if string length -q -- $var; echo not empty; end. Обратите внимание, что string length будет интерпретировать список из нескольких переменных как дизъюнкцию (то есть любую/или):

Альтернативно, используйте test -n "$var", но помните, что переменная должна быть заключена в двойные кавычки. Например, if test -n "$var"; echo not empty; end. Команда test предоставляет свои собственные and (-a) и or (-o):

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

В отличие от .bashrc и .profile, этот файл всегда читается, даже в неинтерактивных или логиновых оболочках.

Чтобы выполнить что-то только в интерактивных оболочках, проверьте status is-interactive следующим образом:

if status is-interactive
    # use the coolbeans theme
    fish_config theme choose coolbeans
end

[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, чтобы предварительно просмотреть и выбрать пригласительный символ из галереи образцов.

Или вы можете использовать fish_config из командной строки:

> fish_config prompt show
# displays all the prompts fish ships with
> fish_config prompt choose disco
# loads the disco prompt in the current shell
> fish_config prompt save
# makes the change permanent

Если вы хотите изменить свой существующий пригласительный символ, вы можете использовать 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_config в командной строке, например:

> fish_config theme show
# to demonstrate all the colorschemes
> fish_config theme choose coolbeans
# to load the "coolbeans" theme
> fish_config theme save
# to make the change permanent

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

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

set -U fish_greeting

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

set -g fish_greeting

в файле config.fish.

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

Введите часть команды, а затем нажмите клавиши со стрелками ↑ (вверх) или ↓ (вниз), чтобы перейти к совпадениям в истории, или нажмите Control+R, чтобы открыть историю в просматриваемом поиске. В этом просмотре вы можете нажать Control+R или Control+S, чтобы перейти к более старой или более новой истории соответственно.

Дополнительные клавишные сочетания по умолчанию включают Control+P (вверх) и Control+N (вниз). См. Поиск по истории команд для получения дополнительной информации.

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

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

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

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

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

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

END_OF_DOCUMENT_MARKER

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

fish использует скобки для подкоманд. Например:

for i in (ls)
    echo $i
end

Он также поддерживает знакомый синтаксис $(), даже в кавычках. Обратные кавычки не поддерживаются, так как они не рекомендуются даже в оболочках POSIX. Они плохо вложены и трудно отличить от одинарных кавычек ('').

Моя команда (pkg-config) выводит результат как одну длинную строку?

В отличие от других оболочек, fish разделяет подстановки команд только по символам новой строки, а не по пробелам, табуляции или символам в $IFS.

Это означает, что если вы выполните

count (printf '%s ' a b c)

будет напечатано 1, потому что «a b c » используется целиком. Но если вы сделаете

count (printf '%s\n' a b c)

будет напечатано 3, потому что она передала count аргументы «a», «b» и «c» по отдельности.

В подавляющем большинстве случаев разделение по пробелам нежелательно, поэтому это улучшение. Именно поэтому вы слышите о проблемах с именами файлов, содержащими пробелы.

Однако иногда, особенно с 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
     ^

Теперь 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.

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

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

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

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

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

Это упрощает работу, но также означает, что когда config.fish генерирует вывод, он будет делать это даже в неинтерактивных оболочках, таких как те, которые ssh/scp/rsync запускают при подключении.

Любой вывод в config.fish должен быть защищён с помощью status is-interactive (или status is-login если вам так удобнее):

if status is-interactive
  ...
end

То же самое относится, например, к запуску tmux в config.fish без защиты, что приведёт к сообщению, подобному sessions should be nested with care, unset $TMUX to force.

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

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

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

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

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

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

  • Шрифты с переменной шириной — нет способа для 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 не имеет мнения относительно достоинств перечисленных выше репозиториев или скриптов, в них содержащихся.

© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.6/faq.html

Spec-Zone.ru

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