Як я можу отримати конкретний аргумент з попередньої команди в bash?


31

У bash ви можете використовувати !*для отримання всіх аргументів з попередньої команди. Наприклад, якщо ви зробили, cp /some/path /some/other/pathа потім зробили mv !*, друга команда буде розширена на mv /some/path /some/other/path.

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

Відповіді:


38

В !*, !є префікс розширення історії , і *це слово позначення, яке означає всі аргументи. Ви можете запам'ятати загальний синтаксис як вибух-рядок-двокрапка-колонка ( стовпець !рядка :). Існує багато можливих ярликів: рядок за замовчуванням - це попередній рядок, специфікатор стовпця за замовчуванням - "все", і ви можете залишити двокрапку, якщо специфікатор стовпця нечисловий (але !3означав би рядок 3). Ви можете використовувати !:0для позначення імені команди !:1, !:2і т.д., для позначення послідовних аргументів, !:$за останнім словом, !:*для всіх аргументів, і багато іншого.

Дивіться також цю публікацію Майкла Мрозека на біржі стеків Unix .


1
Я сам спробував це, проте це не вийшло. Подивившись на цю посаду Michale Мрозек, це говорить використання !:1, !:2. Після використання версії з колонами це спрацювало.
— Wuffers

@MrMan: На жаль, якщо ви залишаєте двокрапку з цифрою, число інтерпретується як номер рядка. Вибач за це.
— Жил 'SO- перестань бути злим'

Без проблем. Тож я припускаю, що виконання !1:1вказувало б на перший аргумент першого рядка?
— Wuffers

4

Особисто мені дуже не подобається ця функція "розширення зі знаком оклику", яка навіть буде турбувати, якщо ви спробуєте echo "Hello World!"в інтерактивних оболонках (так скрипт-джерела, які передбачають, що вони будуть працювати в неінтерактивному режимі, взагалі не працюватимуть).

Отже, я встановлюю set +o histexpandі починаю згадувати аргументи наступним методом:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Зауважте, що фокус Esc полягає в тому, що у мене немає мета-ключа.


Я майже ніколи не використовую знаки оклику в командах. Тож метод «Знак оклику» для мене прекрасно працює.
— Wuffers

Тоді насолоджуйтесь. Багато з численних функцій вашої оболонки розроблені лише для кількох користувачів.
— Бенуа

Насправді вам не потрібно уникати знаків оклику. Зробіть echo 'Hello, orld!'. Зверніть увагу на одиничні лапки замість подвійних.
— Wuffers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.