Maneira de substituir automaticamente o arquivo original pela saída? [duplicado]

0

Eu tenho um site onde estou formatando arquivos sass ( .scss ) com o comando sass-convert . Sua sintaxe é esta:

$> sass-convert original.scss formatted.scss

Como estou em um repositório do git, ter um arquivo de saída separado é completamente supérfluo. Meu próximo passo seria mv formatted.scss original.scss . Eu gostaria de fazer algo para evitar o segundo passo. Algo como

$> sass-convert original.scss %^&

Onde %^& é alguma sintaxe mágica de shell / bash que faz o que eu quero.

Existe uma maneira de eu substituir automaticamente o arquivo de saída com o arquivo de entrada em uma única linha, usando a sintaxe bash (ou outro shell)?

Minha pergunta é diferente de esta questão porque iconv criará primeiro o arquivo de saída, o que tornaria o arquivo de entrada vazio, portanto nenhuma das soluções listadas abaixo funcionará. Se você olhar as respostas dessas duas perguntas, verá que elas são diferentes. As respostas para essa pergunta funcionam para qualquer comando que não crie imediatamente o arquivo de saída.

    
por user394 19.04.2017 / 21:07

3 respostas

1

Usando os operadores de histórico do Bash :

sass-convert original.scss !#:$

!# designa a linha atual, :$ o último argumento (até agora).

Isso funciona com sass-convert ; mas, para um uso mais geral, vale a pena observar que os programas que truncam sua saída antes de concluírem o processamento de suas entradas não funcionam usando essa abordagem.

    
por 19.04.2017 / 21:15
5

Os programas Unix podem ter uma opção -i inplace (por exemplo, versão mais antiga de sed não, mas a maioria agora roubou esse sinalizador de perl ), verifique a página man para obter detalhes. Isso geralmente fará com que o programa grave a saída em um arquivo temporário e execute uma chamada rename(2) para gravar a nova saída sobre o nome original (essa renomeação também pode destruir contextos selinux ou outras ACL sofisticadas no processo, o que pode ser uma preocupação se você usar essas coisas).

Outra solução para o padrão write-to-tmp-file-and- rename(2) é sponge de moreutils :

$ echo hi > file
$ tr h b < file | sponge file
$ cat file
bi
$ 
    
por 19.04.2017 / 21:58
0

No modo tcsh ou zsh in emacs (geralmente o padrão), você pode digitar:

sass-convert original.scss Ctrl+Alt+_

Ctrl + Alt + _ copia a palavra anterior ( copy-prev-word widget).

Observe que ele copia a palavra anterior delimitada em branco, não entende de citação nem nada parecido (ao contrário da expansão do histórico !#:$ csh-style).

Outra abordagem (também funciona com bash e outros shells baseados em readline) ainda no modo emacs :

sass-convert original.scssCtrl+WCtrl+Y Ctrl+Y

Com o zsh, você também pode fazer:

(){sass-convert $1 $1} original.scss

Com (t) csh / ksh / zsh / bash, usando a expansão de contraventamento:

sass-convert original.scss{,}
    
por 20.04.2017 / 13:36

Tags