Suponha que eu tenho um arquivo chamado filename123.txt
e é o único arquivo que é chamado assim, e eu posso locate
lo com o comando locate filename123
. E ele retorna apenas esse arquivo.
Agora eu quero abri-lo com vi
/ vim
. Mas não quero ir para esse local e digite o vi
comando seguido pelo nome do arquivo. Aqui eu quero que o resultado locate filename123
seja anexado ao comando vi. Como posso fazer isso? Eu já tentei:
locate filename123 | vi
Mas isso não funciona. E este erro vem no terminal:
santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
command-line
terminal
vim
io-redirection
locate
Santosh Kumar
fonte
fonte
Respostas:
Você pode usar
xargs
:Por padrão
xargs
, executará o menor número possível de instâncias do comando especificado, passando o maior número possível de parâmetros, de acordo com o ARG_MAX do sistema . Para limitar o número de parâmetros passados para uma instância devi
, usexargs
'-n
option.Para manipular nomes de arquivos contendo espaços, use
xargs
a-d
opção ' :Para lidar com nomes de arquivos contendo novas linhas, use
xargs
a-0
opção ' juntamente comlocate
a-0
opção ' s :(Se
-0
não estiver disponível em nenhum deles, verifique--null
também, ou outra maneira de especificar o caractere\000
como delimitador.)fonte
locate
comando como entrada para o vi. O Vi, como qualquer outro programa, espera que o nome do (s) arquivo (s) funcione como argumento.Você pode usar a expansão de comando:
Para fazer a
vim
leitura do stdin, você pode fazervim -
, mas isso fornecerá apenas a saída doslocate
caminhos do nome do arquivo. Isso pode funcionar, porém, o usovim
gf
do comando normal abrirá o caminho em que o cursor está.Editar
No caso de nomes de arquivos com espaços, é melhor usar a
xargs
opção mencionada ou avim
solução descrita acima. Nota para fazer ogf
trabalho, você precisa adicionar espaço paraisfname
:Esta dica e alternativas são descritas aqui .
Editar 2
Citações adicionadas e
head
conforme sugerido por PeterO nos comentários .fonte
another
efile
:(.vi "$(locate filename123)"
... Para garantir que ele tenha apenas um nome de arquivo para lidar:vi "$(locate filename123 |head -n1)"
A maneira mais simples é passar
locate
como substituição de shell , como:Você também pode considerar usar em
find
vez delocate
passar nomes de arquivos para editar, por exemplo:No Unix / OSX você pode usar
xargs
com o-o
parâmetro, como:Ou no Linux, tente a seguinte solução alternativa usando:
Se você estiver usando comandos diferentes, use a substituição de comandos para conseguir isso, como:
Como alternativa, use o GNU em
parallel
vez dexargs
forçar a alocação de tty, no exemplo:Nota:
parallel
no Unix / OSX não funcionará, pois possui parâmetros diferentes e não suporta tty.Muitos outros comandos populares também fornecem alocação pseudo-tty (como
-t
emssh
), portanto, procure ajuda.Outra sugestão seria usar
vipe
(um canal de comando do Vim) ou usar o seguinte script simples:Palavras-chave:
fonte