Como criar um arquivo que é denominado como um argumento de linha de comando?

28

Eu queria saber como criar um arquivo com o nome de flag, por exemplo, se eu quisesse criar uma pasta chamada -a , quais comandos fariam o truque?

Eu tentei mkdir '-a' , mkdir \-a e nem trabalhei. Estou no Ubuntu.

    
por MYV 26.05.2013 / 11:15

4 respostas

49

Chame o comando da seguinte forma:

mkdir -- -a

O -- significa que as opções terminam depois disso, então o -a é interpretado literalmente e não como uma opção para mkdir . Você encontrará essa sintaxe não apenas em mkdir , mas em qualquer utilitário compatível com POSIX, exceto echo e test . Da especificação :

The argument -- should be accepted as a delimiter indicating the end of options. Any following arguments should be treated as operands, even if they begin with the '-' character. The -- argument should not be used as an option or as an operand.

Usar -- como proteção é recomendado para quase todas as ações em que você lida com nomes de arquivos e deseja garantir que eles não violam o comando, por exemplo, ao mover arquivos em um loop, talvez você queira chamar o seguinte, para que um arquivo chamado -i não seja (em?) analisado corretamente como uma opção:

mv -- "$f" new-"$f"
    
por 26.05.2013 / 11:17
21

A maneira mais simples que deve funcionar com qualquer programa razoável é usar um nome de caminho relativo na frente de - , por exemplo, mkdir ./-a criará um diretório chamado -a no diretório de trabalho atual.

O exemplo mais comum de usar esse "truque" é quando você deseja remover um arquivo que começa com um traço, para que você possa fazer rm ./-a .

    
por 26.05.2013 / 12:27
4

A razão pela qual mkdir '-a' ou mkdir \-a não funciona é porque ambos os métodos (usando aspas ou barras invertidas) são usados para impedir que o shell (provável bash ) seja dando-lhes algum significado especial. Como -a não significa nada de especial para o shell, eles não têm efeito sobre como ele é passado para mkdir .

No que diz respeito a mkdir , ele recebe uma lista de argumentos do shell, e não é possível dizer se você os coloca entre aspas ou não, ou se houve uma barra invertida. Apenas vê um argumento -a . É por isso que você precisa do -- conforme explicado nas outras respostas.

    
por 26.05.2013 / 22:07
-3

Além da resposta de "slhck", há outro truque que às vezes funciona:

Coloque o nome do arquivo em questão dentro de 2 conjuntos de qoutes (diferentes) como "'-a'" ou '"-a"' .

Se isso funciona ou não depende do programa, mas é um último recurso se o programa não suportar o recurso POSIX -- .
O método POSIX é sempre preferido, pois é 100% confiável.

    
por 26.05.2013 / 11:25