Me preguntaba cómo hacer un archivo con el nombre de una bandera, por ejemplo, si quisiera hacer una carpeta con nombre -a
, ¿qué comandos funcionarían?
Probé mkdir '-a'
, mkdir \-a
y tampoco funcionó. Estoy en Ubuntu
Me preguntaba cómo hacer un archivo con el nombre de una bandera, por ejemplo, si quisiera hacer una carpeta con nombre -a
, ¿qué comandos funcionarían?
Probé mkdir '-a'
, mkdir \-a
y tampoco funcionó. Estoy en Ubuntu
Respuestas:
Llame al comando así:
mkdir -- -a
Esto --
significa que las opciones terminan después de eso, por lo que -a
se interpreta literalmente y no como una opción mkdir
. Encontrará esta sintaxis no solo en mkdir
, sino en cualquier utilidad compatible con POSIX, excepto para 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.
--
Se recomienda usarlo como salvaguarda para casi cualquier acción en la que trate con nombres de archivos y desee asegurarse de que no rompan el comando, por ejemplo, cuando mueva archivos en un bucle, es posible que desee llamar a lo siguiente, de modo que un archivo llamado -i
isn ' t (in?) correctamente analizado como una opción:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.c
como un ejemplo ligeramente artificial. Cualquier editor que valga la pena debería poder guardarlo en un archivo llamado -myfile.c
si se lo solicita, pero el compilador de C probablemente no hará lo que quiere cuando se le dé dicha lista de opciones.
cc
comando que Michael dio anteriormente, que tiene la -o
opción de especificar el archivo de salida.
for f in ./*; do...
lugar defor f in *; do...
La forma más sencilla que debería funcionar con cualquier programa razonable es usar un nombre de ruta relativo delante de -
, por ejemplo mkdir ./-a
, creará un directorio llamado -a
en el directorio de trabajo actual.
El ejemplo más común de uso de este "truco" es cuando desea eliminar un archivo que comienza con un guión, para que pueda hacerlo rm ./-a
.
./
siempre son una buena idea: imagine que creó un archivo llamado -rf
y luego llamó rm *
.
--
no se entiende por todos los comandos, solo algunos)
--
era una cosa bash, ¿así que debería funcionar para todos los programas?
La razón por la cual mkdir '-a'
, o mkdir \-a
no funciona es porque ambos métodos (usando comillas o barras invertidas) se utilizan para evitar que su shell (probablemente bash
) les dé un significado especial. Como de -a
todos modos no significa nada especial para el shell, estos no tienen ningún efecto sobre cómo se transmite mkdir
.
En lo que a él mkdir
respecta, recibe una lista de argumentos del shell, y no puede decir si los puso entre comillas o no, o si hubo una barra invertida. Solo ve un argumento -a
. Es por eso que necesita lo --
que se explica en las otras respuestas.
Además de la respuesta de "slhck" hay otro truco que a veces funciona:
Ponga el nombre de archivo en cuestión dentro de 2 conjuntos de qoutes (diferentes) como "'-a'"
o '"-a"'
.
Si esto funciona o no depende del programa, pero es un último recurso si el programa no admite la --
función POSIX .
Siempre se prefiere el método POSIX ya que es 100% confiable.
--
para finalizar el procesamiento de opciones también supone que no necesita ninguna opción para seguir el nombre del archivo, que no siempre es el caso.
'-a'
o "-a"
, al menos en sistemas de tipo BSD