¿Qué significa !# (hash de exclamación), !$:r:r (dos puntos de exclamación r), !#:t (hash de exclamación dos puntos t) en los siguientes comandos bash?

¿Qué significa !# (hash de exclamación), !$:r:r (dos puntos de exclamación r), !#:t (hash de exclamación dos puntos t) en los siguientes comandos bash?

He estado intentando instalar un paquete de Nagios y me topé con estas extrañas expansiones de bash en una guía.aquí. ¿Alguien puede ayudarme a entender qué significan las expansiones? Un enlace wiki también sería útil para referencia 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

Respuesta1

Estos sonbashpalabras clave de expansión del historial. Seleccionan una línea del historial del shell y la reinsertan (partes de ella), posible después de la modificación. El sitio al que se vinculó hace un trabajo razonable al explicarlos, pero no los describe todos.

tar zxvf !#:t

en realidad no tiene sentido: !#selecciona la línea escrita hasta el momento, pero eso es así tar zxvfy no queremos reutilizar nada de eso. Debería ser

tar zxvf !$:t

que selecciona la última parte de la línea anterior ( !$), que es la URL proporcionada a wget, y toma la parte del nombre del archivo ( :t, para la cola; estrictamente hablando, es lo que queda después del último separador de directorio, /que funciona muy bien con las URL).

Entonces

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

selecciona la última parte de la línea anterior, elimina la extensión del archivo ( :ren sentido estricto, elimina todo lo que está después del último ., incluido el .) dos veces, lo que proporciona el nombre del directorio (asumiendo que el tarball contiene un directorio con el mismo nombre que el nombre base del tarball). ). Los comandos chmody cdproceden de la misma manera.

información relacionada