Como “menos” um arquivo chamado “-”?

17

Eu acidentalmente criei um arquivo com o nome - (por exemplo, seq 10 > - ). Então eu tentei usar o less para visualizá-lo, mas ele simplesmente trava.

Eu entendo que isso está acontecendo porque less - espera a entrada de stdin , por isso 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 consegui é:

find -name '-' -exec less {} +
    
por fedorqui 17.06.2015 / 11:18

3 respostas

53

Basta prefixar com ./ :

less ./-

Ou use o redirecionamento:

less < -

Observe que, como - (em oposição a -x ou --foo-- , por exemplo) é considerado um nome de arquivo especial em vez de uma opção, o seguinte não funciona:

less -- -   # THIS DOES NOT WORK
    
por 17.06.2015 / 11:19
3

Gostaria apenas de mv - f && less f . Problema resolvido.

    
por 18.06.2015 / 05:30
3

Observação: minha resposta é NÃO válida no caso do OP, e só se aplica a ferramentas seguindo a convenção mencionada abaixo e não no caso de um arquivo chamado exatamente - (traço), que geralmente é também um caso especial para especificar que a leitura da entrada padrão é esperada. Veja a resposta aceita.

Deixando isto aqui, pois contém informações úteis para outros casos em que alguém pode tropeçar enquanto procura por respostas.

Double-Dash!

Use a convenção padrão de duplo traço ( -- ) para indicar o último argumento:

less -- -FILENAME

Exemplo

$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!

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 visam visivelmente que você deve segui-lo ao implantar as ferramentas CLI.

Recomendado pelo Grupo Aberto

O OpenGroup também menciona isso nos padrões de descrição do utilitário (v6) seção de sua especificação básica:

Default Behavior: [...] Standard utilities that do not accept options, but that do accept operands, shall recognize "--" as a first argument to be discarded.

The requirement for recognizing "--" is because conforming applications need a way to shield their operands from any arbitrary options that the implementation may provide as an extension. For example, if the standard utility foo is listed as taking no options, and the application needed to give it a pathname with a leading hyphen, it could safely do it as:

foo -- -myfile

and avoid any problems with -m used as an extension.

E nas Diretrizes de Sintaxe do Utilitário (v7 ):

Guideline 10: The first -- argument that is not an option-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.

Recomendado por Bash

Aqui, extraído do manual do bash, sobre seus recursos internos que o suportam:

Unless otherwise noted, each builtin command documented in this section as accepting options preceded by - accepts -- to signify the end of the options.

The :, true, false, and test builtins do not accept options and do not treat -- specially. The exit, logout, break, continue, let, and shift builtins accept and process arguments beginning with - without requiring --. Other builtins that accept arguments but are not specified as accepting options interpret arguments beginning with - as invalid options and require -- to prevent this interpretation.

Note that echo does not interpret -- to mean the end of options.

Leitura adicional

por 17.06.2015 / 11:28

Tags