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

Это именно то, как ваш дистрибутив упаковал sudo.

В группе sudo нет ничего особенного, это обычная группа Linux.

Сила группы sudo заключается в том, что она указана в файле /etc/sudoers (.d )как имеющая право повышаться до root для любых команд.

Есть несколько вещей, которые необходимы для работы sudo:

  1. исполняемый файл sudo должен быть настроен на gid
  2. ваш пользователь или группа, в которую входит ваш пользователь, должны быть указаны в /etc/sudoers.d
  3. ваш пользователь должен войти в группу при запуске sudo

Если одно из этих утверждений неверно, например, если ваш дистрибутив воссоздал группу sudo, например, потому что он хочет, чтобы у группы sudo был определенный gid, при первой установке sudo, то возможно, что ваш sudo выиграл не работает.

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

45
29.02.2020, 14:57
8 ответов

Это не ваш терминал , это ваша оболочка .

Имя искомого механизма оболочки — буфер уничтожения . Люди забывают, что они есть в редакторах командной строки оболочки. Они есть в ZLE в оболочке Z, а также в GNU Readline в оболочке Bourne Again, в libedit в (FreeBSD )оболочке Almquist, в построчном редакторе оболочки Korn и построчном редакторе оболочки TENEX C.

Во всех этих оболочках в режиме emacsпросто перейдите в конец строки для сохранения, уничтожьте ее в буфер уничтожения головы с помощью & #x2388; Нажмите + U , введите и запустите промежуточную команду, а затем извлеките содержимое буфера уничтожения с помощью и #x2388; Управление + Y . Убедитесь, что вы ничего не делаете с буфером уничтожения при вводе промежуточной команды.

В оболочке Z в режиме viу вас есть последовательности префиксов viдля указания именованного буфера в стиле vi-, в который нужно уничтожить строку. Вы можете использовать один из других буферов вместо буфера по умолчанию. Просто используйте что-то вроде "add(в режиме vicmd), чтобы удалить всю строку в буфер "a", введите и запустите промежуточную команду, и затем поместите содержимое этого буфера с помощью "ap .

В их viрежимах оболочка Korn, GNU Readline в оболочке Bourne Again и libedit в (FreeBSD )Almquist shell не имеют именованныхvi-стилевых буферов, только один вырезанный буфер. dd для удаления строки в этом буфере с последующим помещением содержимого буфера с помощью p . Но он использует тот же буфер стиля vi-, что и уничтожение и выдергивание при вводе промежуточной команды.

52
28.04.2021, 23:22

Нет, он не будет сохранен в истории командной строки, потому что он принимает только введенные команды.

Однако вы можете добавить «эхо» в начале, чтобы сохранить что-то сложное для ввода

echo /usr/bin/complicate -v e -r y -c o -m p -l ic -a t -t ed

Затем вызовите команду echo и отредактируйте, чтобы удалить "echo ".

Если вам нужно что-то в истории в качестве подготовки к дальнейшему, вы также можете отредактировать файл истории, например. ~/.bash_historyдля bash или ~/.historyдля tcsh. Редактируйте, изменяя существующую команду, это проще всего, потому что вам не нужно пытаться угадать синтаксис файла. В следующий раз, когда оболочка запустится, if будет прочитана в (, если оболочка настроена на сохранение и чтение истории, что происходит по умолчанию в большинстве систем ).

Третий способ использовать сложную команду без большого количества ввода — определить псевдоним для команды. Опять же, синтаксис зависит от варианта оболочки :

.

баш:

alias ll='ls -algF --color=auto'

ткш:

alias ll 'ls -algF --color=auto'

Новая команда llбудет аналогична вводу ls -algF --color=auto. Вы можете увидеть существующие псевдонимы (для примеров ), просто выполнив aliasбез параметров.

Эти строки можно ввести в ~/.bashrcи ~/.tcshrcсоответственно, чтобы сохранить их для всех предстоящих запусков оболочки.

1
28.04.2021, 23:22

Если ваша оболочка настроена на режим emacs(обычное значение по умолчанию для bash, я полагаю):

#set -o | grep emacs
emacs         on

тогда можно:

<Ctrl>a or <arrowkeys> # to go to the beginning of the current line or to wherever you want
<Ctrl>k    # to "kill" the content from the cursor position to the end of the line + SAVE it
... here you type the command you forgot to add...
<Ctrl>y    # to "yank" the SAVED line into the current editing line. or <Ctrl>p in ksh(??)
<Enter>    # to execute it

#note: you can also replace: <Ctrl>a<Ctrl>k with: <Ctrl>u # kills the whole line + SAVE it

Это делается очень быстро и входит в привычку. ctrl -k также может быть полезен для сохранения только «конца» строки (, например :2 длинных аргумента, которые, как вы знаете, вы будете повторно использовать позже, которые вы «убиваете» (+save ), и что вы можете затем «дергать» назад столько раз, сколько хотите)

Если ваша оболочка находится в режиме vi , вы можете использовать обычные команды vim:

<Esc>      # to go back to normal(command) mode, if you were in editing mode
dd         # to delete the whole current line + SAVE it  (see note below)
i          # to reenter editing mode
... here you type the command(s) you forgot...
<Esc>      # to return to normal mode
p          # to paste the buffered line + place the cursor on top of the last character
a          # to reenter editing mode past that current character
<Enter>    # to execute it

# note: instead of "dd" (kill whole line) you can simulate emacs <Ctrl>a<Ctrl>k with:
#    | or h or l  # to go to the 1st char of the line or wherever # simulates <Ctrl>a or <arrow keys>
#    d$  # to delete from the current position to the end of the line + SAVE it # <Ctrl>k
4
28.04.2021, 23:22

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

really long command thigng -flag -flag2

Нажмите домой, введите новую команду, а затем &&, чтобы выполнить сначала, а в случае успеха — второе.

first command && really long command thigng -flag -flag2

Как бы то ни было, это не будет сохранено как отдельные шаги.

В качестве альтернативы:

Если вы уже ввели первую команду (при нажатии клавиши ввода ), вы можете ввести first_command && !!, которая вставит вторую команду в!!

4
28.04.2021, 23:22

Вы не хотите добавлятьecho(или любую другую команду типа no -op -)к своей строке, поскольку у вас может быть перенаправление ввода-вывода, и они все равно будут выполняться, потенциально перезаписывая любой файл, который вам может понадобиться для доступа к (, пока вы не будете готовы выполнить свою команду ).

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

Если вы находитесь в режиме vi, ksh и bash (по крайней мере )имеют специальную команду для этого :войдите в командный режим (нажмите Esc ), затем нажмите#персонаж.

Это специально для этого -варианта использования. Описание этой команды в книге O'Reilly Learning the Korn Shell гласит:

Prepend # (comment character) to the line and send it to the history file; useful for saving a command to be executed later without having to retype it. If the line already starts with a #, remove the leading # and any other comment characters that follow newlines in a multiline command.

31
28.04.2021, 23:22

Вы можете выделить/скопировать текст с помощью графического интерфейса или средств оболочки, а затем либо вставить его в какой-либо файл, либо просто не забыть не перезаписать его последующим выбором (, чтобы вы при необходимости можно вставить его обратно ), но я нахожу неудобным :место полных командных строк ИМХО в «истории клавиш вверх и вниз».

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

Напр. с bash, привязывая его к Meta/Alt-Cили Esc-C(, обычно привязанному к capitalize-wordв привязках клавиш emacs; используйте другой ключ, если вы его уже используете):

bind -x '"\ec": history -s "$READLINE_LINE"; READLINE_LINE='

Если вы используете сочетания клавиш vi -, вы можете использовать для них неиспользуемые ^G:

bind -x '"\C-g": history -s "$READLINE_LINE"; READLINE_LINE='

Это также очистило бы линию впоследствии; если вы не хотите этого (и предпочитаете вручную отменить строку, например. ^C), опустить READLINE_LINE=.

3
28.04.2021, 23:22

Если вы используете zsh, вы можете использовать Ctrl -Q , которая запускает командуpush-line. Он сохранит то, что вы сейчас набрали, в стек, очистит подсказку, а затем вытолкнет стек после ввода следующей команды. Я использую это все время именно для ситуации, которую вы описываете.

16
28.04.2021, 23:22

Если вы уже ввели вторую команду, перейдите к началу строки, введите первую команду, а затем разделите их точкой с запятой. Это если успех не имеет значения. Если это имеет значение, && кто-то другой предложил.

2
28.04.2021, 23:22

Теги

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