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

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

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

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

27 голосов | спросил MattLBeck 7 Maypm12 2012, 13:59:23

4 ответа


34

Если вы используете 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 (т.е. invoke fc как fc -ln "" "", он выводит только последнюю команду).

[Примечание. Ответ отредактирован для учета комментария @ Bram и вопроса, упомянутого в ответе @glenn jackman.]

ответил camh 7 Maypm12 2012, 14:16:59
8

Одна проблема с ответом @ 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"
ответил glenn jackman 7 Maypm12 2012, 19:12:30
2

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

например.

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

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

ответил ryanbraganza 8 Mayam12 2012, 03:58:39
0

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

$> history -a LOGBOOK

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

$> alias getlast="history -a LOGBOOK"
ответил stringbasic 7 Maypm12 2012, 14:11:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132