Виконайте ще одну команду, але як root


116

Іноді, коли я запускаю команду, я не помічаю, що мені потрібно було запустити її як суперкористувача, щоб мати достатній дозвіл.

Чи є спосіб запустити ту ж команду ще раз, але як супер користувач?

Відповіді:


195

Найпростіший спосіб - запустити:

sudo !!

Це запустить останню команду, але як супер користувач.

Джерело .


5
Я вважав це досить корисним, і раніше не стикався з цим (хоча це може бути загальновідомо). Я не зміг його знайти на сайті, тому думав, що сам відповім на нього.
Труфа

30
Убік виконання !!самостійно виконує попередню команду згідно зі збереженими в history. Крім того, виконуючи !-1, !-2і так далі виконує останню команду, другу останню команду тощо. Зручно!
oaskamay

6
З іншого боку, !<command>виконаємо останню подію з ~/.bash_historyцього початку<command>
Раду Радеану

1
ctrl-r також дуже корисний. він буде шукати назад у вашій історії для команд, які відповідають тому, що ви вводите. Це дозволить вам редагувати команду, перш ніж запустити її знову
KayEss,

4
Ця дурна !штучка, скопійована з tcshмене, накрутила мене більше разів, ніж це було корисно. Подвійні цитати не захищають від тлумачення !. $ foo "!bar"-> !bar: event not found.
Каз

70

Сігналы абмеркаваннявведіть тут опис зображення

відповіді : ви вводите sudo !!одразу після цього, щоб повторити попередню команду з нарощеними привілеями.

редагувати: Зображення знайдено через reddit , і це пародія на оригінальний комікс xkcd від Рендалла Манро.


3
будь ласка, не ведіть розмову проти або проти коментарів тут. Якщо ви хочете обговорити достоїнства чи іншим чином, будь ласка, використовуйте Meta. Дякую.
fossfreedom

17

Ви можете спробувати клавішу зі стрілкою вгору, щоб прокрутити старі команди та переписати / змінити їх та додати sudoперед ними. (кнопка додому над клавішами зі стрілками встановить позицію на початку.)

Мені не подобається sudo !!ідея, бо іноді ти додаєш ще одну команду між ними і більше не пам'ятаєш.


1
На щастя, коли ви це зробите sudo !!, оболонка розшириться, !!щоб ви могли бачити, яку команду вона намагається запустити. Таким чином, це може дратувати натиснути Ctrl-C і знайти правильну команду, але це, принаймні, не позбавить вас зненацька.
Рейд

4
@Reid Це не буде розширюватися до тих пір , після того, як ви натиснете ввести, і якщо ви в цьому вікні , де ви не повинні знову ввести пароль, він буде працювати без підтвердження. +1 до використання історії замість сліпого використання!!
Ізката

5
@Izkata: Я думаю, це правда. Я використовую zsh, тому я просто набираю, sudo !!<TAB>і він автоматично завершується !!для мене. Bash може розширити історію за допомогою M-^(для мене, alt + shift + 6), але це менш вільно (хоч ви можете відновити це). Крім того shopt -s histverify, це робить так, що коли ви використовуєте розширення історії та натискаєте клавішу Enter, вона натомість надає вам ще один рядок підказки із виконаним розширенням, яке дозволяє вам бачити / редагувати його.
Рейд

1
Я більше думав про ситуацію, коли я вводив команду, команда повертала, що дозвіл було відмовлено, і я знаю, що хочу запустити цю саме таку команду ще раз, але як судо, процес натискання вгору, додому, введення судо і відчуваєш багато повільніше для мене. Це так, як я це робив назавжди, і це було просто неефективно.
Труфа

@Reid: shopt -s histverifyне допоможе жоден біт. Більшість людей звикне до удару Enterдвічі. У той момент вони все ще пізно, щоб перевірити, що сталося.
Френк Кустерс

13

Я просто додам альтернативу: коротку, як набір тексту sudo !!та гнучкішу:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Це точно така ж кількість натискань клавіш (я рахую "ctrl + A" як один ...), але додаючи "стрілку вгору", ви можете це робити за будь-якою командою в історії.


1
ctrl + A - це посилання на emacs, ви також можете використовувати vi bind ( set -o vi). Потім ви можете Escape (перейти до командного режиму), а потім 'I' (з великої літери 'i', вставити на початку рядка).
Герхард Бургер

1
@GerhardBurger: Я знаю, але, дивно, я люблю vi (особливо vim) за редагування багаторядкових документів, але я дуже віддаю перевагу прив'язці emacs в оболонці (необхідність переходу з команди на режим редагування в оболонці не робить насправді має сенс, imo, і ярликів emacs цілком достатньо для повсякденного використання, навіть якщо менш потужні)
Олів'є Дулак

Щоправда, я додав його просто для повноти, для мене це те саме, проте мені здається, що пошук за допомогою "/" дуже зручний;)
Герхард Бургер

@GerhardBurger: про "/", регулярний (прив’язування emacs) режиму vi також є дуже зручним способом пошуку попередніх команд, набравши кілька літер, потім "ctrl + r", поки не знайдеш
Олів'є Дулак

7

Є кілька способів зробити це

  • Просто введіть команду ще раз, додаючи sudoперед командою

  • Натисніть, Up arrowщоб отримати останню команду, і поставте sudoперед нею.

  • Введіть sudo !!

В !!розростається до останньої введеної команди. Ви можете робити подібні речі з іншими речами з історії командного рядка, див. Тут


7

Це питання можна було б узагальнити до " Запустити одну команду, але з деякою модифікацією ", оскільки одне з блискучих дизайнерських рішень в Unix полягає в тому, що те, що реалізується один раз в оболонці, може бути використане будь-якою командою, що викликається з оболонки.

Іншими словами, ця хитрість не застосовується лише до sudo:

  • Повторіть попередню команду як суперпользователь ( sudo !!)
  • Повторіть попередню команду та час ( time !!)
  • Повторіть попередню команду з іншим середовищем ( env A=b B=z !!)
  • Повторіть попередню команду ( !!)

Розширення історії (також відоме як заміна історії) - лише функція оболонки, щоб спростити повторення попередніх команд (з меншим натисканням клавіш). Перевірте свою сторінку "man shell" history expansion. У ньому описано ще багато хитрощів та скорочень, які ви можете зробити з історією, наприклад:

Ви можете посилатися на попередні команди за номером:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Ви можете посилатися на окремі слова в попередніх командах:

some-command !$     # run some-command on the last arg of previous command

Ви також можете здійснити пошук перед повторенням:

!?awk               # repeat the last command including the string 'awk'

Ви можете шукати історію та щось замінювати чимось іншим:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

І багато іншого, оскільки ви можете комбінувати вибір команд, арг-підбір, пошук та заміну самостійно.

Сторінка людини вашої оболонки (в даному випадку man bash) - ваш друг.


1
блискучий! що має бути прийнята відповідь.
Еліран Малька

5

Я використовую zsh замість bash і маю це у своєму ~/.zshrc, тому натискаючи Alt+ Sвставки sudoна початку командного рядка:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

На жаль, я не зміг знайти спосіб зробити те ж саме в баші.


3
Ви можете легко зробити те ж саме в Bash, використовуючи GNU Readline: додайте до свого, ~/.inputrc "\es":"\C-asudo "і ви перейдете до початку довгого рядка, а судо буде вставлено на початку рядка після натискання alt-s. Перезапустіть термінал або перечитайте ~/.inputrcйого для роботи.

2

Якщо ви хочете зробити це псевдонімом, вам доведеться скористатися alias redo='sudo $(history -p !!)'чомусь.


1
su -c "!!"

Якщо у вас немає дозволу мати root з sudo або програма sudo не встановлена ​​в системі.


1

Як я вважаю за краще:

  • Клавіша зі стрілкою вгору
  • Головна
  • "судо"
  • Введіть

Але може бути простіше просто зробити "судо !!", це залежить від вас.

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