Вопрос или проблема
Это наблюдение довольно странное, но должно быть легко воспроизвести.
-
Начните новую сессию tcsh (и ssh-вход в мой случай, не должно иметь значения).
-
установите history=100; установите savehist=1; выполните какую-либо команду и проверьте, что история работает, т.е. что выполняемые команды записываются в историю.
-
определите многострочный алиас.
alias echopath 'foreach k (`seq 1 $#path`) \
echo ${k}: $path[$k] \
end'
-
Выполните алиас echopath.
-
Теперь команда не записывается в историю. Вывод истории заканчивается следующим, и новые команды не записываются.
15 8:32 h
16 8:32 echopath
17 8:32 echo ${k}: $path[$k]
18 8:32 end
- Что, черт возьми, здесь происходит?
Ответ или решение
Проблема с сохранением истории команд в tcsh при использовании многострочного алиаса
Когда вы работаете с командной оболочкой tcsh, иногда можно столкнуться с необычным поведением, связанным с записью истории команд. В данном случае причина, по которой команда больше не записывается в историю после выполнения многострочного алиаса, может быть связана с несколькими факторами. Рассмотрим этот вопрос более подробно.
Воспроизведение проблемы
Для начала необходимо следовать пошаговому процессу, чтобы воспроизвести данное поведение:
- Запустите новую сессию tcsh (SSH-подключение здесь не имеет значения).
- Установите параметры истории:
set history=100 set savehist=1
После этого выполните несколько команд и проверьте, записываются ли они в историю.
- Определите многострочный алиас:
alias echopath 'foreach k (`seq 1 $#path`) \ echo ${k}: $path[$k] \ end'
- Выполните алиас
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 и сделать её более предсказуемой.