Что означают !# (восклицательный знак «решетка»), !$:r:r (восклицательный знак «доллар» и двоеточие «r»), !#:t (восклицательный знак «решетка» и двоеточие «t») в приведенных ниже командах bash?

Что означают !# (восклицательный знак «решетка»), !$:r:r (восклицательный знак «доллар» и двоеточие «r»), !#:t (восклицательный знак «решетка» и двоеточие «t») в приведенных ниже командах bash?

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

root@z:~> wget http://mathias-kettner.de/download/check_mk-1.1.7i5.tar.gz
root@z:~> tar zxvf !#:t
root@z:~> chown -R root:root !$:r:r && chmod -R o-w !$:r:r && cd !$:r:r
root@z:~/check_mk-1.1.7i5> ./setup.sh

решение1

Этоbashистория расширения ключевые слова. Они выбирают строку из истории оболочки и вставляют ее (части) заново, возможно, после модификации. Сайт, на который вы ссылаетесь, делает разумную работу по их объяснению, но он не описывает их все.

tar zxvf !#:t

на самом деле не имеет смысла: !#выбирает строку, набранную до сих пор, но это tar zxvfи мы не хотим повторно использовать ничего из этого. Это должно быть

tar zxvf !$:t

который выбирает последнюю часть предыдущей строки ( !$), которая является URL-адресом, указанным для wget, и берет часть имени файла ( :t, для tail — строго говоря, это то, что осталось после последнего разделителя каталогов, /, что прекрасно работает с URL-адресами).

Затем

chown -R root:root !$:r:r

выбирает последнюю часть предыдущей строки, удаляет расширение файла ( :r— строго говоря, он удаляет все, что находится после последнего ., включая .) дважды, что дает имя каталога (предполагая, что tarball содержит каталог с тем же именем, что и базовое имя tarball). Команды chmodи cdдействуют таким же образом.

Связанный контент