Llame al comando así:
mkdir -- -a
El --
significa que las opciones terminan después de eso, por lo que -a
se interpreta literalmente y no como una opción para mkdir
. Encontrará esta sintaxis no solo en mkdir
, pero cualquier utilidad compatible con POSIX excepto echo
y test
. De la especificación:
El argumento -- debe aceptarse como un delimitador que indica el final de las opciones. Los siguientes argumentos deben tratarse como operandos, incluso si comienzan con el carácter '-'. El argumento -- no debe usarse como una opción o como un operando.
Usando --
como medida de seguridad se recomienda para casi cualquier acción en la que trate con nombres de archivo y quiera asegurarse de que no rompan el comando, p. al mover archivos en un bucle, es posible que desee llamar a lo siguiente, de modo que un archivo llamado -i
no está (¿en?) analizado correctamente como una opción:
mv -- "$f" new-"$f"
La forma más sencilla de que funcione con cualquier programa razonable es usar un nombre de ruta relativo delante del -
, p.ej. mkdir ./-a
creará un directorio llamado -a
en el directorio de trabajo actual.
El ejemplo más común de usar este "truco" es cuando desea eliminar un archivo que comienza con un guión, por lo que puede hacer rm ./-a
.
La razón por la que mkdir '-a'
, o mkdir \-a
no funciona porque ambos métodos (usando comillas o barras invertidas) se usan para evitar que su shell (probablemente bash
) de darles algún significado especial. Desde -a
no significa nada especial para el shell de todos modos, esto no tiene ningún efecto sobre cómo se pasa a mkdir
.
Hasta mkdir
en cuestión, recibe una lista de argumentos del shell, y no puede saber si los puso entre comillas o no, o si hubo una barra invertida. Solo ve un argumento -a
. Por eso necesitas el --
como se explica en las otras respuestas.