История команд tcsh не записывается после выполнения многострального алиаса.

Вопрос или проблема

Это наблюдение довольно странное, но должно быть легко воспроизвести.

  1. Начните новую сессию tcsh (и ssh-вход в мой случай, не должно иметь значения).

  2. установите history=100; установите savehist=1; выполните какую-либо команду и проверьте, что история работает, т.е. что выполняемые команды записываются в историю.

  3. определите многострочный алиас.

alias echopath 'foreach k (`seq 1 $#path`) \
 echo ${k}: $path[$k] \
end'
  1. Выполните алиас echopath.

  2. Теперь команда не записывается в историю. Вывод истории заканчивается следующим, и новые команды не записываются.

    15  8:32    h
    16  8:32    echopath
    17  8:32    echo ${k}: $path[$k]
    18  8:32    end
  1. Что, черт возьми, здесь происходит?

Ответ или решение

Проблема с сохранением истории команд в tcsh при использовании многострочного алиаса

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

Воспроизведение проблемы

Для начала необходимо следовать пошаговому процессу, чтобы воспроизвести данное поведение:

  1. Запустите новую сессию tcsh (SSH-подключение здесь не имеет значения).
  2. Установите параметры истории:
    set history=100
    set savehist=1

    После этого выполните несколько команд и проверьте, записываются ли они в историю.

  3. Определите многострочный алиас:
    alias echopath 'foreach k (`seq 1 $#path`) \
    echo ${k}: $path[$k] \
    end'
  4. Выполните алиас echopath.

Наблюдаемое поведение

После выполнения алиаса вы заметите, что история перестала обновляться. В выводе истории после выполнения вы увидите следующее:

    15  8:32    h
    16  8:32    echopath
    17  8:32    echo ${k}: $path[$k]
    18  8:32    end

Причины остановки записи истории

1. Многострочные алиасы

Когда вы определяете многострочный алиас в tcsh, он обрабатывается как один блок, поэтому команды внутри этого блока не воспринимаются как отдельные команды для хранения в истории. Это могло привести к тому, что при исполнении алиаса запись истории о последующих командах не происходила.

2. Встроенные функции и циклы

Ваша команда foreach выполняет цикл, и его тело (включая echo и end) также не записывается в историю, так как они обрабатываются в рамках одного контекста выполнения. Таким образом, tcsh не регистрирует их как отдельные команды.

3. Сохранение истории

Также важно понимать настройки savehist. Значение 1 означает, что будет сохраняться только одна сессия. Возможно, стоит увеличить это значение, чтобы убедиться, что история сохраняется корректно.

Как решить проблему

Для решения возникшей проблемы можно использовать несколько подходов:

  • Использовать однострочные алиасы: Если возможно, избегайте многострочных алиасов или разбивайте их на отдельные команды.
  • Прямой ввод интерпретируемых команд: Вместо создания многострочного алиаса, просто вводите команды напрямую в терминале.
  • Использование функций: Вместо алиасов используйте функции. Например:
function echopath {
  foreach k (`seq 1 $#path`)
    echo ${k}: $path[$k]
  end
}

Заключение

Проблема, с которой вы столкнулись, является известной особенностью tcsh и касается обработки многострочных алиасов. Понимание того, как работает система истории в tcsh, позволит вам лучше управлять своими командами и избегать подобных ситуаций. Надеемся, эти рекомендации помогут вам улучшить работу с tcsh и сделать её более предсказуемой.

Оцените материал
Добавить комментарий

Капча загружается...