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.