Як я можу отримати конкретний аргумент з попередньої команди в 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.