Bash ярлык для получения родительского элемента последнего использованного параметра
В моем рабочем процессе я обычно делаю:
cat this/very/long/filename.txt
cd !$
bash: cd: this/very/long/filename.txt: Not a directory
Что следует ожидать: (
И теперь я восстанавливаю последнюю команду, удаляю вручную часть файла и повторяю cd
, который теперь работает. Это слишком много печатает!
Было бы здорово, если бы был ярлык bash
, например:
cd !§
Что может дать мне родительский последний использованный параметр. Я знаю, что !§
не существует, я просто хотел, чтобы это произошло! Есть ли что-то, что может удовлетворить это?
Ответы
Ответ 1
Et voilà. Модификаторы истории приходят на помощь!
$ cd !!:$:h
который может быть сокращен до
$ cd !$:h
Эта команда принимает последний аргумент предыдущей команды и удаляет конечное имя пути.
Подробнее:
-
!!
расширяется до предыдущей команды
-
:$
расширяется до последнего аргумента предыдущей команды
-
:h
принимает заголовок; то есть удаляет имя файла (которое является завершающей частью последнего аргумента).
В стороне,
!!:$:t
делает точно противоположное.
Для углубленного обсуждения, пожалуйста, обратитесь к документации Bash.
Ответ 2
Эта более короткая версия также будет работать:
cd !$:h
Подробнее:
-
!$
является синонимом !!:$
, который представляет последний аргумент предыдущей команды.
-
:
отделяет модификатор от указателя event-word.
-
h
- это модификатор, который удаляет компонент конечного имени файла.
Ответ 3
Основываясь на ответе, представленном несколькими другими людьми,
идеальный рабочий процесс - это ввести cd !$:h
после команды cat this/very/long/filename.txt
.
Этот ответ cd !$:h
будет работать после cd !$
, но, как только вы допустили эту ошибку,
вы можете использовать еще более короткий !:h
, который повторяет последнюю команду (cd this/very/long/filename.txt
),
но взяв только главу последнего слова.
Я использую эти малоизвестные сокращения:
-
!word_designator
эквивалентно !!:word_designator
для нечислового word_designator s (например, !$
эквивалентно !!:$
) и
-
!:modifier
эквивалентен !!:modifier
(например, !:h
эквивалентно !!:h
).
Ответ 4
В этом случае я обычно делаю: (у меня есть привязка ключей emacs)
cd
Alt-dot Alt-b (n раз) Ctrl-K
лучше:
cd
Alt-dot ALT-Backspace (n раз)
note Alt-b или ALT-Bs может быть нажата несколько раз, пока вас не устраивает путь.
Ответ 5
cat this/very/long/filename.txt
cd !!^:h
cd this/very/long
-
!!
относится к последней команде
-
^
первый аргумент, второе слово (обозначение слов)
-
:h
удалите конечный компонент пути, оставив головку (модификаторы).
Ответ 6
Вместо навигации по истории вы также можете рассмотреть использование переменной $_
для ссылки на последний аргумент предыдущей команды (см. _
в разделе "Специальные параметры" bash(1)
).
Для дальнейшего разбиения компонента имени файла ( "все после и после последнего косой черты" ) используйте расширение параметра (удалить соответствующий шаблон суффикса):
$ cat this/very/long/filename.txt
$ cd ${_%/*}
Последняя команда будет cd this/very/long
, так как /filename.txt
будет удалена. Разница с расширением истории заключается в том, что эта команда (cd ${_%/*}
) добавляется в историю.