Em um PowerShell (7), pode-se executar um comando Linux usando: wsl grep 'test'
.
Como posso executar um comando mais complicado que envolve tubulação (no Linux/WSL) e espaços?
Por exemplo:
wsl find . -name '*.txt' | xargs grep 'main('
Isso resulta em um erro:
xargs: The term 'xargs' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
embora xargs
esteja obviamente disponível dentro do WSL.
Variações disso, como colocar outro wsl
na frente do xargs
resultado neste erro:
wsl find . -name '*.txt' | wsl xargs grep 'main('
/bin/bash: -c: line 1: syntax error near unexpected token `('
/bin/bash: -c: line 1: `xargs grep main('
ResourceUnavailable: Program 'wsl.exe' failed to run: The pipe is being closed.At line:1 char:1
+ wsl find . -name '*.txt' | wsl xargs grep 'main('
+ ~~~~~~~~~~~~~~~~~~~~~~~~.
Observe que quero fazer isso diretamente de um PowerShell, não primeiro iniciar um terminal WSL e, em seguida, executar o comando Linux dentro dele (o que obviamente funciona).
wsl find . -name '*.txt' | xargs grep 'main('
é executadofind . -name '*.txt'
dentro do wsl e canaliza o resultado paraxargs
o shell atual , que está fora do wsl, portanto, obviamente, não pode ser executado sexargs
não estiver disponível no ambiente host. Você tem que executar todo o pipeline dentro do wsl:Mas você precisará ajustar
-n
outros argumentos, se necessário, para torná-lo mais eficiente. Ou se seus arquivos não contiverem espaço ou novas linhas, você poderá simplesmente passar todo o resultado paragrep
quegrep
seja executado apenas uma vezVocê também pode executar o pipeline no PowerShell assim
Ou fazer tudo do PowerShell sem passar pelo wsl
Ou se o arquivo não precisar ser pesquisado recursivamente, isso funcionará