Normalmente acrescento a arquivos de texto usando cat
:
cat >> FILE
Eu uso um alias para evitar sobrescrever acidentalmente o arquivo (com um único >
):
alias a='cat >>'
Enter altera a linha e Ctrl+ Dencerra o comando. Eu escrevo em vários arquivos de texto em minha pasta pessoal, todos os quais criei, possuo e posso editar.
Em várias ocasiões, tanto no meu sistema desktop Linux (Fedora 39) quanto no Termux (Android), o comando parou de redirecionar para um arquivo enquanto aceitava entradas aparentemente normalmente. Perdi centenas de linhas, principalmente URLs que colei. Parece ocorrer apenas quando o comando está em execução há algum tempo.
Há algum motivo pelo qual o redirecionamento cat >>
pode deixar de funcionar? Por exemplo, algum caractere especial (na entrada) tem efeito?
ATUALIZAÇÃO : confirmei que o número do inode dos respectivos arquivos continua mudando ( $ ls -li
ou veja a hora exata com $ stat -c '%w'
) - isso ocorre porque o Syncthing por design recria os arquivos sincronizados . Terei que reavaliar como estou usando o software no futuro. Desculpe por não mencionar o Syncthing em primeiro lugar.
Dos comandos que automatizei, pelo menos sed -i
(editar um arquivo no local) também substitui o inode.
O comando cat >> FILE
também deveria ser substituído (foram dadas sugestões, veja os comentários e a resposta).
Ao ser executado
cat >> file
, o shell é abertofile
no diretório de trabalho atual emO_WRONLY|O_CREAT|O_APPEND
um processo filho em fd 1 e, se for bem-sucedido, é executadocat
nesse processo.Caso contrário, o shell exibirá uma mensagem de erro e não será executado
cat
.Se não conseguir encontrar um
cat
comando, também exibirá uma mensagem de erro.cat
por sua vez, em um loop lê seu fd 0 e escreve o que leu em fd 1.Novamente, se isso não acontecer, uma mensagem de erro será exibida.
Se o processo em execução
cat
for encerrado ou suspenso por um sinal, o shell também deverá reportá-lo no stderr (como Limite de tamanho de arquivo excedido se encerrado comSIGXFSZ
ou suspenso (entrada tty) se suspenso com SIGTTIN).Se fd 0 for aberto em um dispositivo tty e esse dispositivo tty for o mesmo, o shell lê seus comandos, o que normalmente será o caso, antes de executar
cat
, o shell configurará a disciplina de linha do tty da maneira que estava antes de entrar em seu próprio editor de linha .Geralmente isso significa que estará no
icanon
modo em que a disciplina de linha implementa um editor de linha bruto.Em tudo isso, esse editor de linha é realmente a única coisa que reconhece caracteres especiais.
stty -a
lhe dará uma lista. No meu caso aqui:Você verá o
icanon
mencionado acima.^C
,^\
,^?
,^U
,^D
,^Q
,^S
,^Z
,^R
,^W
,^V
,^O
caracteres são tratados de maneira especial.^C
// sujeito a (no meu caso habilitado),^Z
/ sujeito a , ( acima ) não suportado no Linux.^\
isig
^S
^Q
ixon
discard
^O
Por exemplo, se você inserir
foobar^Ubaz
, ofoobar
é kill , mas, novamente, você o verá sendo apagado no eco do que você digita.Entrar no
^C
personagem matariacat
no meio de sua vidaread
.Mas a maioria dos emuladores de terminal hoje em dia remove esses caracteres ao colar arquivos . Então, para que isso aconteça ao colar, você precisaria usar um terminal que ainda não faça essa remoção ou que algumas dessas configurações
kill
/werase
/intr
... sejam definidas para alguns caracteres sem controle, o que seria um condição patológica.Esse editor de linha também tem um limite no tamanho da linha que pode editar. No Linux, IIRC tem 4.095 bytes. Portanto, se você colar uma linha maior que essa, qualquer coisa além do 4095 byte será descartada.
No
icanon
modo,cat
'sread()
retornará quando o editor de linha tty sair, o que acontecerá quando você entrar^M
(o que é traduzido como^J
onicrnl
) ou^J
ou qualquer um dos caractereseol
,eol2
oueof
.Mas em qualquer caso, se
cat
sair normalmente, ou seja, se não for eliminado por SIGINT upon^C
ou SIGQUIT upon^\
ou suspenso por SIGTSTP upon^Z
, e não reportar um erro, ele terá lido a entrada do terminal e gravado no arquivo .Resumindo, o que você está experimentando não deveria acontecer em condições normais, e os únicos casos em que consigo pensar seriam os patológicos em que:
stty -a
estão todas erradas.Não descarte erros humanos, como não ver o erro relatado pelo
cat
shell ou pelos arquivos criados em um diretório diferente do que você pensou, ou removido, substituído, renomeado ou truncado enquantocat
está em execução (como por aquele Syncthing que você mencionou usando nos comentários).Com esse
a='cat >>'
alias, se você inserira some file
em vez dea 'some file'
, serácat >> some file
o mesmo quecat file >> some
ecat
leráfile
em vez de stdin e gravará a saída emsome
vez desome file
.Uma possível melhoria em relação a esse alias (assumindo GNU
tee
) seria:Where
rlwrap
oferece um editor de linha mais avançado do que o driver tty bruto (e com o qual você já estará familiarizado se estiver usandobash
como shell) e um prompt que deixa mais claro que está esperando alguma entrada.E usar
tee
permite gravar a entrada em vários arquivos de uma só vez.Se a intenção é evitar a substituição acidental de arquivos, considere definir uma variável de shell apropriada. Por exemplo, para
bash
,Exemplo