Виконайте ще одну команду, але як 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.