2013-03-29 3 views
2

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

Я нахожу, что много раз я делаю много итераций в командной строке с одним слоем, и когда я в конечном итоге использую его или ожидаю, что буду использовать его в будущем или когда он станет громоздким для работы в одной строке, как правило, рекомендуется превратить однострочный шрифт в сценарий оболочки и придерживаться его где-то разумным и легкодоступным, например ~/bin.

Это, очевидно, слишком громоздко, чтобы использовать какие-либо окольный способ, включающий текстовый редактор, чтобы получить это сделать, и это можно просто сделать это на оболочке, например, в Zsh набрав

echo "#!/usr/bin/env sh" > ~/bin/command_from_history_number_523.sh && echo !523 >> ~/bin/command_from_history_number_523.sh 

с последующим прессованием Вкладка, чтобы ввести команду !523 rd и каким-то образом перевести ее в приемлемую строку для сохранения.

Это особенно громоздкое и имеет на минимуме три проблемы:

  • Не работает в Баше, как это не завершает !523
  • Требует некоторые ручной осмотр и струнные анкерный
  • требует слишком много печатать например, имя скрипта должно быть введено дважды

Так что, похоже, мне нужно сделать некоторые мета-скриптовые скрипты здесь.

Я думаю, что хорошее решение будет работать как в bash, так и в zsh, и, вероятно, это должно сработать, если принять два аргумента, целое число для номера команды history и имя для сценария оболочки, чтобы вырваться из жесткого каталога, который содержит это одна команда. Кроме того, в bash, кажется, что многострочные команды рассматриваются как отдельные команды, но я готов предположить, что мы заботимся только об одном слое, и я использую zsh в любом случае на этом этапе.

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

Обновление: Я согласен с комментарием @Floris, что прямое использование команд нравится !! было бы полезно, хотя я не уверен, как это сделать. Предположим, у меня есть использование быть

mkscript command_number_24 !24 

этого недостаточно, потому что mkscript будет получать развернутые из содержимого 24-й команды. если 24-я команда содержит какие-либо файловые глобусы или что-то еще они уже были расширены. Это плохо, и я в основном хочу содержимое файла истории, то есть необработанную командную строку. Я думаю, это можно обойти, вручную применив эти ярлыки здесь. Или просто вверните его и просто возьмите целочисленный аргумент.

+4

я не согласен с посылкой «Это, очевидно, слишком громоздки, чтобы использовать ... текстовый редактор». Когда фрагмент сценария должен стать многоразовым, мне нужно его пересмотреть, чтобы он обрабатывал аргументы и т. Д. Часто это означает улучшение обработки ошибок. Это то, что я делаю лучше всего в текстовом редакторе. Я использую механизм «редактирования истории» (vi-mode в 'bash' launching' vim') для редактирования сценария еще раз, сохраняя его в файле в ~/bin, а затем удаляя и сохраняя его из буфера (так что это не выполняются еще раз). Затем я смогу исправить скрипт; добавьте главный комментарий, который идентифицирует, что он делает и т. д. –

+0

Просто, чтобы убедиться, что ваш вопрос ясен: вам нужен сценарий (назовем его 'mkscript'), который вызывается с помощью' makecript somename! 123', который создает «обертку» "для команды, которая является номером 123 в вашей истории. Я бы порекомендовал, чтобы '!' Мог быть включен только для того, чтобы вы могли набрать '!!' для последней команды и не должны вычислять номер истории. Вы можете проверить, является ли второй аргумент единственным целым или строкой, чтобы подтвердить используемый синтаксис. Это то, что вы имеете в виду? Я должен согласиться с наблюдением @JonathanLeffler, хотя ... – Floris

+0

@JonathanLeffler Ваша точка верна, однако для меня вполне разумно также сделать это **, а затем перейти в текстовый редактор ** с помощью сценария оболочки shebang уже создан для меня и т. д. Флорис, да. –

ответ

2
function mkscript() { 
    echo '#!/bin/bash' > ~/bin/$2 
    history -p '!'$1 >> ~/bin/$2 
} 

Только протестировано в Bash.

Обновление от OP: В Zsh я могу сделать это с fc -l $2 $2

Смежные вопросы