Eu acidentalmente criei um arquivo com o nome -
(por exemplo, seq 10 > -
). Então eu tentei usar less
para vê-lo, mas ele simplesmente trava.
Entendo que isso está acontecendo porque less -
espera a entrada de stdin
, portanto, ele não interpreta o -
como um nome de arquivo. Eu tentei, less \-
mas também não funciona.
Então, existe alguma maneira de indicar less
que -
é um arquivo e não stdin?
O melhor que pude obter é:
find -name '-' -exec less {} +
-
sozinho é diferente.-
não é uma opção.-
não é tratado como uma opção, é um problema totalmente diferente do caso de argumentos que têm a forma de opções.-
entre aspas simples'-'
ou escapar como,\-
porque-
não é um caractere especial para shells comuns (pelo menos os compatíveis com POSIX). O resultado é o mesmo.Respostas:
Apenas prefixe-o com
./
:Ou use o redirecionamento:
Observe que, como
-
(ao contrário de-x
ou--foo--
por exemplo) é considerado um nome de arquivo especial e não uma opção, o seguinte não funciona:fonte
find -name '-' -exec less {} +
corre.-
e./-
(ou/path/to/-
ou../to/-
) são dois (4) caminhos válidos para esse-
arquivo, mas um-
argumento é especial paraless
(significa ler a partir de stdin) enquanto./-
não é especial.find -name '-' -exec less {} +
é o formulário não padrão parafind . -name '-' -exec less {} +
. Ele desce a árvore em.
e localiza arquivos e passa os caminhos desses arquivos como argumentos paraless
. Substitua-exec less
por-exec echo less
para ver o que está sendo executado.--
é marcar o final das opções. Não vai ajudar aqui. Isso-
não é uma opção, é um argumento especial de não-opção. Veja também unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756--
é manipulado por getopt () para marcar o final das opções,-
não é reconhecido como uma opção por getopt (), de modo que-
será reconhecido como um argumento normal, independentemente de--
ser fornecido ou não. E como um argumento normal,less
como a maioria dos utilitários de texto o tratará como significando stdin, o que não queremos aqui.Eu apenas
mv - f && less f
. Problema resolvido.fonte
Nota: minha resposta NÃO é válida no caso do OP, e somente se aplica a ferramentas que seguem a convenção mencionada abaixo e não no caso de um arquivo chamado exatamente just
-
(dash), que geralmente também é um caso especial para especificar essa leitura do padrão entrada é esperada. Veja a resposta aceita.Deixando isso aqui, pois contém informações úteis para outros casos em que alguém pode se deparar enquanto procura respostas.
Dê um duplo passo!
Use a
--
convenção double-dash ( ) padrão para indicar o último argumento:Exemplo
Whhhaattt?
Esse
--
argumento deriva de uma convenção suportada pela maioria das implementações de utilitários de shell e ferramentas de linha de comando, e a maioria dos shells defende visivelmente que você deve segui-lo ao implemente as ferramentas da CLI.Recomendado pelo Open Group
O OpenGroup também o menciona na seção Padrões de descrição do utilitário (v6) de sua Especificação básica:
E nas Diretrizes de sintaxe do utilitário (v7):
Recomendado por Bash
Aqui, extraído do manual do bash, sobre os componentes internos que o suportam:
Leitura Adicional
fonte
-
qual não é uma opção. Usando./-
ou redirecionamento quando possível é geralmente uma abordagem melhor, pois evita outros tipos de problemas, como ofoo=bar
deawk
ou que-
. Veja também unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
ainda tentará ler do stdin.