Использование глобуса оболочки (подстановочный знак (*)) после расширения переменной в двойных кавычках

Нет стандарта; некоторая комбинация команды man , команды info | less , команда -h , команда --help , команда -help (тьфу, Java), поиск README, altagoobingleduckgoing и т. д. . должен использоваться в зависимости от команды и того, насколько хорош поставщик в написании документации (OpenBSD очень хорош в этом отношении, другие хорошо, может быть, да).

Предупреждение! Попытка использовать случайные флаги в качестве root - очень плохая идея, так как мне пришлось исправить имя хоста в ящиках Solaris, где какой-то администратор Linux запустил hostname -f и, таким образом, установил все Solaris имена хостов на -f .

Другой вариант - поискать в пакетах или портах doc или каталоги таких типов, которые будут зависеть от рассматриваемого порта или системы пакетов:

$ port contents nasm | egrep 'man|doc'
  /opt/local/share/man/man1/ldrdf.1.gz
  /opt/local/share/man/man1/nasm.1.gz
  ...

$ rpm -ql mutt | grep manual
/usr/share/doc/mutt-1.5.21/manual.html
/usr/share/doc/mutt-1.5.21/manual.txt

(и т. Д.)

{{1 }}
-3
14.02.2018, 12:48
2 ответа

Un patrón de aglomeración de nombre de archivo mantenido en una variable no aglomerará los nombres de archivo si están entre comillas dobles. Son las comillas dobles las que evitan que los nombres de archivo se aglomeren, no el comodín *al final o la combinación de comillas y *.

A menudo les decimos a los usuarios en el sitio que "citen sus variables", y lo hacemos porque los valores de las variables sin comillas se dividen en palabras y se agregan nombres de archivos, y esto generalmente no es lo que se desea. Por ejemplo, una contraseña puede ser [hello] world*y en una línea de comando que contiene -p $passwordque haría cosas "interesantes" dependiendo de qué archivos estaban presentes en el directorio actual (y es posible que no funcione en absoluto debido a la espacio ). Consulte también la pregunta " Implicaciones de seguridad de olvidar citar una variable en shells bash/POSIX "

Lo que quiere hacer aquí es lo contrario de lo que normalmente queremos evitar , es decir, invocar el nombre de archivo globbing usando el patrón de globbing de nombre de archivo en su variable.

Si realmente no puede confiar en que el nombre del directorio extraído permanezca estable, una mejor solución (como "más limpia" )sería asegurarse de que es el solo cosa en un directorio temporal, y luego simplemente use *para moverlo a su lugar (posiblemente cambiando su nombre en el proceso, para que sepa con certeza cómo se llama ).

Esto es mejor que simplemente eliminar las comillas alrededor de su variable, ya que el patrón de globbing del nombre de archivo podría coincidir con otros nombres además del único que espera,dependiendo de qué otras cosas estén disponibles en el directorio.

Esta es una variación de mi respuesta a su pregunta anterior:

#!/bin/sh -ex

destdir="/var/www/html/phpmyadmin"

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT    # remove temporary directory on termination

wget -O "$tmpdir/archive.zip" \
    "https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip"

cd "$tmpdir" && {
    unzip archive.zip
    rm -f archive.zip

    # The only thing in the current (temporary) directory now is the
    # directory with the unpacked zip file.

    mkdir -p "$destdir"
    mv./* "$destdir"/phpmyAdmin
} 

Lo anterior puede resumirse en cinco pasos:

  1. Cree un directorio vacío (y cambie el directorio de trabajo actual ).
  2. Obtener el archivo.
  3. Extraiga el archivo.
  4. Eliminar el archivo.
  5. Cambie el nombre de la carpeta solitaria ahora en el directorio vacío.
6
28.01.2020, 05:18

How could I keep the variable expansion double quoted, but still using the extracted value with a wildcard?

No pudiste 1 , y no quieres ; su comando funciona perfectamente bien sin ellos (y estoy bastante seguro de que también se señaló en una de las variantes eliminadas -anteriores de esta pregunta ).

$ mkdir phpMyAdmin-4.7.7-all-languages
$ pma=[pP][hH][pP][mM][yY][aA][dD][mM][iI][nN]
$ echo $pma
[pP][hH][pP][mM][yY][aA][dD][mM][iI][nN]
$ echo $pma*/
phpMyAdmin-4.7.7-all-languages/
$ mv $pma*/ phpmyadmin
$ ls
phpmyadmin

El objetivo de citar sus variables es asegurarse de que no ocurran shell globbing y field split . Esta vez realmente quieres que eso suceda, por lo que citar es contraproducente.

Vale la pena entender por qué existen estas directrices; no son reglas generales, y si no funcionan para usted, es posible que se encuentre en una situación en la que no se aplican. Esforzarse por "seguir las mejores prácticas sin excepciones" sin comprenderlas es totalmente erróneo.


Aparte de eso, esto:

I also understood that one cannot use a shell glob (wildcard(*)) right after a double quoted variable expansion.

no es cierto.

$ tmp=php
$ echo "$tmp"*
phpmyadmin

1 Usted podría usar eval, pero sería tan completamente inútil que no voy a continuar con eso.

0
28.01.2020, 05:18

Теги

Похожие вопросы