Як я можу зберегти останню команду у файл?


29

Коли я запускаю свої аналізи за допомогою оболонки bash, я часто хочу зберегти команди, які я використав, які дали мені хороші результати у файлі в тому самому каталозі (мій "LOGBOOK", як його називають), щоб я міг перевірити, що Я зробив ці результати. Поки що це означало, що я або copy.pasting команди з терміналу, або натискання "вгору" модифікація команди на an echo"my command" >> LOGBOOK, або інші подібні витівки.

historyДнями я виявив, що був інструмент, але я не можу знайти спосіб його використання, щоб отримати раніше виконану команду, щоб я могла зробити щось подібне getlast >> LOGBOOK.

Чи є приємний простий спосіб це зробити. Як альтернатива, як інші справляються зі збереженням команд для результатів, які вони мають?

Відповіді:


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 "" "", він виводить лише останню команду).

[Примітка. Відповідь відредаговано для коментаря @ Bram та проблеми, згаданої у відповіді @glenn jackman.]


5
Першу форму fc -lnr | head -n 1можна скоротити до fc -lnr -1.
Брам

@Bram: Гарні речі. Я використовував help fcдля моєї документації. На сторінці bash man є більш детальна інформація, включаючи використання негативних показників. Усунення headдобре, тому що одна команда зліва вбудована, тому зараз немає fork / exec.
camh

1
Цікаво, чому команда називається fc...
imz - Іван Захарящев

2
Воно означає «виправити команду». gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Mikel

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
включення cmdhistвиправить це: "Якщо встановлено, bash намагається зберегти всі рядки багаторядкової команди в одному записі історії. Це дозволяє легко повторно редагувати багаторядкові команди."
Марк МакКінстрі

2

Замість використання стрілки вгору ви можете використовувати "!!"для посилання на попередню команду.

напр

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

зауважте: це не цитує буквальний текст


5
Це не охопить буквальну команду. Якщо є метахарактеристики оболонки, вони будуть оцінені та замінені. Також будуть розірвані трубопроводи: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh

0

Це можна зробити за допомогою наступної команди, якщо ви використовуєте bash shell:

$> history -a LOGBOOK

Це додасть всі ваші команди з поточного сеансу до цього файлу, ви також можете додати псевдонім у файлі ~ / .bashrc, щоб зробити це за допомогою однієї команди:

$> alias getlast="history -a LOGBOOK"

1
Але ви пропускаєте важливішу вимогу, щоб я зберігав лише ті команди, які працювали, і отримував результати, які я маю. Я не хочу зберігати всі останні команди, які я зробив, просто виберіть їх після їх використання. Все одно, дякую.
MattLBeck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.