8

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

$ cmd [a long list of arguments] 

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

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

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

9 ответов9

8

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

history -s cmd arg1 arg2

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

5

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

$ cmd [arguments] !#%:p
1

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

#cmd [a long list of arguments] 

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

^a#<ENTER>

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

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

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

1

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

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

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

что делает:

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

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

history -s -p $COMMAND

Из help:

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

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

0

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

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

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

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

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

0

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

(Пробел, |, Enter, Ctrl+C)

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

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

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

> Ctrl+C

$ Up

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

0

В этой ситуации я просто добавляю строку к # и затем нажимаю Enter.

... или используйте комбинацию клавиш: ESC #

bind -p | grep -i 'insert-comment'   # "\e#": insert-comment

Смотрите также: Bash - сохранить команду без ее выполнения

0

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

rm old_file && cmd [args]

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

test && cmd [args]

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .