Como 'tocar' e 'cat' arquivo chamado '-' [duplicado]

4

Como eu uso o GNU touch para atualizar um arquivo chamado - ?

Como eu uso o GNU cat para exibir um arquivo chamado - ?

Estou correndo:

% cat --version | head -n1
cat (GNU coreutils) 8.29
% touch --version | head -n1
touch (GNU coreutils) 8.29

Em primeiro lugar, touch :

% touch -
% ls -l
total 0
% touch -- -
% ls -l -- -
ls: cannot access '-': No such file or directory

Ok, desisto de criar um arquivo com touch . Vamos criá-lo com date :

% date > -
% ls -l -
-rw-r--r-- 1 ravi ravi 29 Sep  8 19:54 -
%

Agora, vamos tentar cat it:

% cat -
% # I pressed ^D
% cat -- -
% # Same again - I pressed ^D

Eu sei que posso trabalhar com:

% > -

e

% cat < -

Mas por que esses utilitários GNU não suportam a convenção de que -- significa que tudo o que se segue é tratado como uma não-opção?

Como eu uso essas ferramentas no caso geral, por exemplo, eu tenho uma variável com o conteúdo - ?

    
por Tom Hale 08.09.2018 / 15:17

1 resposta

10

Use um caminho explícito para o arquivo:

touch ./-
cat ./-

O GNU touch trata um operando de arquivo de - especialmente:

A FILE argument string of - is handled specially and causes touch to change the times of the file associated with standard output.

Para cat , o padrão POSIX especifica que um operando de arquivo - deve ser interpretado como um pedido para ler da entrada padrão.

A convenção de dois passos ainda está em vigor, mas não é para sinalizar o fim de argumentos , mas o fim de opções . Em nenhum desses casos, - seria tomado como uma opção (um único - não pode ser uma opção), mas como um operando ("argumento de nome de arquivo").

Com relação à sua última pergunta:

Para proteger o conteúdo de uma variável contra ser interpretado como um conjunto de opções ao usá-lo como

utility "$variable"

use

utility -- "$variable"

Se o utilitário for cat , sed , awk , paste , sort e possivelmente alguns outros (ou GNU touch ) e $variable será - , isso ainda fará com que o utilitário faça seu processamento especial, pois, como dito acima, - não é uma opção. Em vez disso, faça provisões para que os nomes dos arquivos, se eles começarem com ou forem iguais a - , sejam precedidos por um caminho, por exemplo, ./ para arquivos no diretório de trabalho atual.

Um bom hábito é usar

for filename in ./*; do

em vez de

for filename in *; do

por exemplo.

    
por 08.09.2018 / 15:24

Tags