'grep -l .. | xargs vim 'gera um aviso, por quê? [duplicado]

11

Se eu executar um comando como

grep -rl test . | xargs vim

Eu recebo um aviso "Vim: Aviso: a entrada não é de um terminal." Mas ainda sou capaz de editar os arquivos. Por que o aviso?

    
por dan 28.05.2013 / 15:00

3 respostas

18

Como o Vim é chamado de dentro do pipeline , o stdin é conectado à saída do pipeline anterior, não ao terminal. Como um comando interativo, o Vim precisa receber sua entrada do terminal.

Melhor evitar o tubo, por ex. via

$ vim $(grep -rl test .)

ou de dentro do Vim:

:args 'grep -rl test .'
    
por 28.05.2013 / 15:18
5

O Vim precisa de sua entrada padrão para ser o terminal no qual você inserirá os comandos, mas obterá /dev/null ou o canal de grep dependendo da implementação xargs .

Você pode restaurar a entrada padrão por meio de um shell intermediário.

grep -rl test . | xargs sh -c 'vim -- "$@" <$0' /dev/tty

Se os nomes dos arquivos não contiverem nenhum caractere de espaços em branco ou qualquer um de \[?* , você poderá usar a substituição de comandos:

vim $(grep -rl test .)

Uma maneira de lidar com caracteres especiais (além de nova linha) é restringir a divisão de palavras a novas linhas e desativar globbing.

(IFS='
'; set -f; exec vim $(grep -rl test .))
    
por 30.05.2013 / 02:41
1

Se você usar o GNU Parallel em vez do xargs, você não receberá o aviso e as configurações do seu terminal não serão alteradas posteriormente:

grep -rl test . | parallel -X --tty vi

Bônus adicionado: funciona mesmo que nomes de arquivo contenham espaço, 'ou ".

    
por 31.05.2013 / 12:45

Tags