Passando a saída de localizar como argumento para um editor

Passando a saída de localizar como argumento para um editor

O que quero dizer é fazer isso em uma linha:

ubu@ubuntu:~$ locate filename.sh
/home/ubu/path/to/filename.sh
ubu@ubuntu:~$ gedit /home/ubu/path/to/filename.sh

Não consigo descobrir a tubulação certa para fazer isso

Responder1

Soluções simples, mas limitadas

Se houver apenas um arquivo nomeado filename.shem seu sistema, isso provavelmente funcionará

gedit "$(locate filename.sh)"

Ou, como aponta Hennes, se o nome do arquivo estiver em seu PATH:

gedit "$(which filename.sh)"

Há outro problema com ambos: o shell retira as novas linhas da substituição do comando, $(...). Portanto, no caso patológico de o nome do arquivo terminar com novas linhas, isso falhará.

Solução geral

Para evitar esses problemas, tente:

locate -0 "filename.sh" | xargs --null gedit

Isso abrirá uma guia geditpara cada arquivo encontrado.

A -0opção informa locatepara retornar uma lista de nomes de arquivos separados por nulos. A --nullopção diz xargspara interpretar sua entrada como uma lista separada por nulos. Conseqüentemente, isso funcionará com nomes de arquivos com novas linhas ou outros caracteres difíceis.

Por conveniência, você pode criar a função shell:

lge() { locate -0 "$@" | xargs --null gedit; }

E use-o como:lge filename.sh

Para tornar a definição da função permanente, coloque-a no seu arquivo ~/.bashrc.

informação relacionada