O que !# (hash de exclamação), !$:r:r (exclamação dólar dois pontos r), !#:t (exclamação hash dois pontos t) significa nos comandos bash abaixo?

O que !# (hash de exclamação), !$:r:r (exclamação dólar dois pontos r), !#:t (exclamação hash dois pontos t) significa nos comandos bash abaixo?

Eu tenho tentado instalar um pacote Nagios e me deparei com essas estranhas expansões do bash em um guiaaqui. Alguém pode me ajudar a entender o que significam as expansões? Um link wiki também seria útil para referência futura.

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

Responder1

Estes sãobashpalavras-chave de expansão de histórico. Eles selecionam uma linha do histórico do shell e reinserem (partes dela), possível após modificação. O site ao qual você criou um link faz um trabalho razoável explicando-os, mas não descreve todos eles.

tar zxvf !#:t

na verdade não faz sentido: !#seleciona a linha digitada até agora, mas isso é tar zxvfe não queremos reutilizar nada disso. Deveria ser

tar zxvf !$:t

que seleciona a última parte da linha anterior ( !$), que é o URL fornecido para wget, e pega a parte do nome do arquivo ( :t, para final - estritamente falando, é o que resta após o último separador de diretório, /, que funciona bem com URLs).

Então

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

seleciona a última parte da linha anterior, elimina a extensão do arquivo ( :r- estritamente falando, remove o que estiver depois do último ., incluindo o .) duas vezes, o que fornece o nome do diretório (assumindo que o tarball contém um diretório com o mesmo nome que o nome base do tarball ). Os chmodcomandos cde procedem da mesma maneira.

informação relacionada