Что означает [SIGINT] в моей командной строке / терминале?

#shell #terminal #fish

#оболочка #терминал #рыба

Вопрос:

Иногда, когда я работаю на своем терминале, [SIGINT] появляется перед моей кареткой.

  1. Что это значит?
  2. Почему ввод ls удаляет этот маркер?

Изображение, содержащее [SIGINT]

Окружающая среда

Я использую Ubuntu 20.04, работающий fish как моя оболочка.

Ответ №1:

Это означает, что последнее, что вы запустили, было прервано при получении сигнала SIGINT, что обычно происходит при нажатии ctrl-c.

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

Приглашение Fish по умолчанию показывает эту информацию, потому что это полезно, например, если программа потерпела крах, она покажет SIGABRT или что-то подобное.

Чтобы удалить его, вы можете выбрать приглашение, в котором его нет, из примеров с помощью fish_config или создать свое собственное, изменив fish_prompt функцию, например, через

 funced fish_prompt
# try it out, once you are happy run
funcsave fish_prompt
  

Ответ №2:

Если бы это было так bash , я бы сказал, что кто-то настроил bash функцию для запуска при генерации вашего приглашения. Вы можете делать всевозможные замечательные вещи с PS1 переменной окружения. Однако, как вы заявляете, вы используете fish в качестве своей оболочки, поэтому это не PS1 переменная среды.

Это кажется стандартным поведением в fish , по крайней мере, в неизмененном Ubuntu 20.04 виде, о чем свидетельствует следующая расшифровка, где я CTRL-C sleep командую:

 pax@paxbox ~> sleep 3600                # will ctrl-c this.
^C
pax@paxbox ~ [SIGINT]> true             # successful exit.
pax@paxbox ~> false                     # failed exit.
pax@paxbox ~ [1]>
pax@paxbox ~ [1]> fish -c 'exit 42'     # arbitrary exit value.
pax@paxbox ~ [42]>
  

И вы можете увидеть, почему это происходит, посмотрев на вывод functions fish_prompt , поскольку это функция, которая вызывается для генерации подсказок в этой оболочке:

 # Defined in /usr/share/fish/functions/fish_prompt.fish @ line 4
function fish_prompt --description 'Write out the prompt'
    set -l last_pipestatus $pipestatus
    set -l normal (set_color normal)

    # Color the prompt differently when we're root
    set -l color_cwd $fish_color_cwd
    set -l prefix
    set -l suffix '>'
    if contains -- $USER root toor
        if set -q fish_color_cwd_root
            set color_cwd $fish_color_cwd_root
        end
        set suffix '#'
    end

    # If we're running via SSH, change the host color.
    set -l color_host $fish_color_host
    if set -q SSH_TTY
        set color_host $fish_color_host_remote
    end

    # Write pipestatus
    set -l prompt_status (__fish_print_pipestatus " [" "]" "|" (set_color $fish_color_status) (set_color --bold $fish_color_status) $last_pipestatus)

    echo -n -s (set_color $fish_color_user) "$USER" $normal @ (set_color $color_host) (prompt_hostname) $normal ' ' (set_color $color_cwd) (prompt_pwd) $normal (fish_vcs_prompt) $normal $prompt_status $suffix " "
end
  

Строка в конце, настройка prompt_status , добавляется [SIGINT] к выводимому приглашению, когда последняя команда была прервана (или добавляется любой ненулевой код выхода для нормального завершения).

Если вы хотите изменить поведение этой функции, вы можете создать свою собственную копию:

 mkdir -p ~/.config/fish/functions
function fish_prompt >? ~/.config/fish/functions/fish_prompt.fish
  

затем внесите любые изменения, которые вы пожелаете.

Комментарии:

1. Убедительное объяснение! Спасибо, что разбили то, что сделал fish_prompt, и ссылаетесь на фактический источник.