Как я могу сохранить последнюю команду в файл?

29

Когда я выполняю свои анализы с использованием оболочки bash, я часто хочу сохранить команды, которые я использовал, которые дали мне хорошие результаты, в файл в том же каталоге (мой «LOGBOOK», как он называется), чтобы я мог проверить, что Я сделал, чтобы получить эти результаты. До сих пор это означало, что я либо копирую команду из терминала, либо нажимаю «вверх», изменяя команду, либо выполняю echo"my command" >> LOGBOOKдругие подобные действия.

Я обнаружил, что был historyинструмент на днях, но я не могу найти способ использовать его, чтобы получить ранее выполненную команду, чтобы я мог сделать что-то вроде getlast >> LOGBOOK.

Есть ли хороший простой способ сделать это. В качестве альтернативы, как другие справляются с сохранением команд для результатов, которые они имеют?

MattLBeck
источник

Ответы:

37

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

fc -ln -1

Это распечатает вашу последнюю команду. -lозначает список, -nозначает не ставить префикс строк с номерами команд и -1говорит показывать только последнюю команду. Если пробел в начале строки (только первая строка в многострочных командах) мешает, вы можете легко избавиться от этого sed. Сделайте это в функции оболочки, и у вас будет решение, как запрашивается ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

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

Я добавил небольшое изменение, добавив "$1" "$1"в fcкоманду. Это позволит вам, например, getlast mycommandраспечатать последнюю вызванную командную строку mycommand, поэтому, если вы забыли сохранить перед выполнением другой команды, вы все равно можете легко сохранить последний экземпляр команды. Если вы не передаете аргумент getlast(то есть вызываете fcкак fc -ln "" "", он выводит только последнюю команду).

[Примечание: ответ отредактирован с учетом комментария @ Брэма и проблемы, упомянутой в ответе @glenn jackman.]

CAMH
источник
5
Первая форма fc -lnr | head -n 1может быть сокращена до fc -lnr -1.
Брэм
@ Брам: Хорошие вещи. Я использовал help fcдля моей документации. Страница man bash содержит больше подробностей, включая использование отрицательных индексов. Устранение head- это хорошо, потому что одна оставленная команда встроена, так что теперь нет fork / exec.
Camh
1
Интересно, почему команда называется fc...
imz - Иван Захарящев
2
Это означает «исправить команду». gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Микель,
9

Одна проблема с ответом @ camh состоит в том, что если у вас есть команда, которая занимает несколько строк, она показывает только первую строку:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

Попробуй это:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"
Гленн Джекман
источник
3
enable cmdhistэто исправит: «Если установлено, bash пытается сохранить все строки многострочной команды в одной записи истории. Это позволяет легко перередактировать многострочные команды».
Марк Маккинстри
2

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

например

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

примечание: это не цитирует буквальный текст

ryanbraganza
источник
5
Это не захватит буквальную команду. Если есть метасимволы оболочки, они будут оценены и заменены. Трубопроводы также сломаются: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
Camh
0

Вы можете сделать это с помощью следующей команды, если вы используете оболочку bash:

$> history -a LOGBOOK

Это добавит все ваши команды из текущего сеанса в этот файл, вы также можете добавить псевдоним в ваш файл ~ / .bashrc, чтобы сделать это с помощью одной команды:

$> alias getlast="history -a LOGBOOK"
stringbasic
источник
1
Но вам не хватает более важного требования, чтобы я сохранял только те команды, которые работали и получали результаты, которые у меня есть. Я не хочу сохранять все последние команды, которые я сделал, просто выберите те, которые я использовал. Спасибо, в любом случае.
MattLBeck