Fiquei me perguntando como criar um arquivo nomeado como um sinalizador, por exemplo, se eu quisesse criar uma pasta chamada -a
, quais comandos fariam o truque?
Eu tentei mkdir '-a'
, mkdir \-a
e nem funcionou. Estou no Ubuntu.
Fiquei me perguntando como criar um arquivo nomeado como um sinalizador, por exemplo, se eu quisesse criar uma pasta chamada -a
, quais comandos fariam o truque?
Eu tentei mkdir '-a'
, mkdir \-a
e nem funcionou. Estou no Ubuntu.
Respostas:
Chame o comando da seguinte maneira:
mkdir -- -a
Os --
meios que as opções terminam depois disso, então as -a
interpretações são literalmente e não como uma opção mkdir
. Você encontrará essa sintaxe não apenas em mkdir
, mas em qualquer utilitário compatível com POSIX, exceto echo
e test
. A partir da especificação :
O argumento - deve ser aceito como um delimitador indicando o final das opções. Quaisquer argumentos a seguir devem ser tratados como operandos, mesmo se começarem com o caractere '-'. O argumento - não deve ser usado como uma opção ou como um operando.
O uso --
como salvaguarda é recomendado para quase todas as ações em que você lida com nomes de arquivos e deseja garantir que eles não quebrem o comando; por exemplo, ao mover arquivos em um loop, convém chamar o seguinte, para que um arquivo chamado -i
isn ' t (in?) corretamente analisado como uma opção:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.c
como um exemplo apenas um pouco artificial. Qualquer editor que se preze deve ser capaz de salvar em um arquivo nomeado -myfile.c
se você solicitar, mas o compilador C provavelmente não fará o que você deseja quando receber uma lista dessas opções.
cc
comando que Michael deu acima, que tem a -o
opção de especificar o arquivo de saída.
for f in ./*; do...
, em vez defor f in *; do...
A maneira mais simples que deve funcionar com qualquer programa razoável é usar um nome de caminho relativo na frente do -
, 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 fazê-lo rm ./-a
.
./
é sempre uma boa idéia - imagine que você tenha criado um arquivo chamado -rf
e depois chamado rm *
.
--
não é compreendido por todos os comandos, apenas alguns)
--
era uma coisa bash, por isso deve funcionar para todos os programas?
A razão pela qual mkdir '-a'
, ou mkdir \-a
não funciona, é porque esses dois métodos (usando aspas ou barras invertidas) são usados para impedir que seu shell (provavelmente bash
) lhes dê um significado especial. Como -a
não significa nada de especial para o shell, isso não afeta a maneira como ele é repassado mkdir
.
No que diz mkdir
respeito, ele recebe uma lista de argumentos do shell e não sabe 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 --
explicado nas outras respostas.
Além da resposta do "slhck", há outro truque que às vezes funciona:
Coloque o nome do arquivo em questão em 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.
--
para finalizar o processamento de opções também pressupõe que você não precisa de opções para seguir o nome do arquivo, o que nem sempre é o caso.
'-a'
ou "-a"
, pelo menos em sistemas do tipo BSD