Подтвердить что ты не робот

Bash ярлык для получения родительского элемента последнего использованного параметра

В моем рабочем процессе я обычно делаю:

cat this/very/long/filename.txt
cd !$
bash: cd: this/very/long/filename.txt: Not a directory

Что следует ожидать: (

И теперь я восстанавливаю последнюю команду, удаляю вручную часть файла и повторяю cd, который теперь работает. Это слишком много печатает!

Было бы здорово, если бы был ярлык bash, например:

cd !§

Что может дать мне родительский последний использованный параметр. Я знаю, что не существует, я просто хотел, чтобы это произошло! Есть ли что-то, что может удовлетворить это?

4b9b3361

Ответ 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 ${_%/*}) добавляется в историю.