Сохранить команду в историю без выполнения в bash


8

Есть ли способ сохранить команду в истории bash, не выполняя ее? например

$ cmd [a long list of arguments] 

и теперь во время набора я помню, что сначала хотел бы сделать что-то еще. Могу ли я иметь что-то вроде

$ cmd [a long list of arguments][some-key-strokes]

и это на самом деле не выполняется, но входит в историю Bash, чтобы я мог использовать его позже?


5
В этой ситуации я просто префикс строки #, а затем нажимаю Enter.
Оливер Чарльзуорт,

Ответы:


5

Возможно, есть и лучший способ, но вы можете использовать :pмодификатор расширения истории, чтобы напечатать текущую строку комментария без выполнения. !#текущая строка, и %сама по себе ничего не будет соответствовать

$ cmd [arguments] !#%:p

прохладно! ;) и без необходимости экранирования специальных символов в команде, что может запутаться, если команда не просто ls -al+1

прохладно! очень аккуратно

8

Используйте -sопцию для historyкоманды:

history -s cmd arg1 arg2

history -sУдобно, чтобы вызов к себе не добавлялся в историю команд, поэтому в вашей истории он выглядит так, как будто вы выполнялись, cmdфактически не делая этого.


прохладно! это также

1

Обычно это делается

echo 'cmd [a long list of arguments]' >> /home/you/bash_history

Обратите внимание, что название истории может отличаться в вашей системе. Поэтому вы можете использовать HISTFILEсреду var

что делает:

echo 'cmd [a long list of arguments]' >> "$HISTFILE"

1

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

#cmd [a long list of arguments] 

Я предпочитаю этот способ, потому что вы можете сделать это всего лишь 3 [4, если вам нужно SHIFT, чтобы вставить #] нажатий клавиш

^a#<ENTER>

^ а идет в начало текущей строки

# добавляет комментарий

ENTER выполняет комментарий



0

Вы можете попробовать добавить пробел и | (труба) в конце строки, нажав ввод, а затем Ctrl-C'ing.

( Space, |, Enter, Ctrl+ C)

Команда будет в вашей истории с | в конце (можно просто удалить с помощью backspace) вместо # в начале (потенциально более утомительно удалить).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не знаю, всегда ли это работает! Используйте на свой риск!

$ cmd [длинный список аргументов] |

> Ctrl+C

$ Up

$ cmd [длинный список аргументов] |


0

Вы можете попробовать использовать эту строку:

history -s -p $COMMAND

От help:

The -p option means to perform
history expansion on each ARG and display the result,

Это означает, что вы можете расширить такие вещи, как !!и сохранить результат в нижней части истории.


history -sбыл дан в ответе два года назад. Улучшается ли -pэто? Что делает -p? (Если это имеет смысл, вам следует отредактировать свой ответ, чтобы сделать его лучше, а не отвечать на мой комментарий другим комментарием.)
G-Man говорит: «Восстановите Монику»

0

Другой вариант - перейти в начало строки и выполнить то, что вы собирались сделать, а затем &&, например

rm old_file && cmd [args]

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

test && cmd [args]

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


0

Я думаю, что «некоторые нажатия клавиш», которые вам нужны, это Ctrl-U и Ctr-Y, которые сохраняют строку в kill-ring, а затем возвращают ее обратно. Это не входит в историю, но тогда я думаю, что не должно, так как ты этого не делал.

Команды убийства Readline

Убивать и дергать

Я узнал об этом несколько лет назад, затем забыл и пошел искать эти ключевые нажатия тоже.

Это также обсуждается здесь: /unix/140741/how-to-save-a-command-you-entered-without-executing-it

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.