Передача вывода locate в качестве аргумента редактору

Передача вывода locate в качестве аргумента редактору

Я имею в виду, что это можно сделать в одну строку:

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

Кажется, я не могу придумать правильную схему соединения труб.

решение1

Простые, но ограниченные решения

Если в вашей системе есть только файл с именем filename.sh, это, скорее всего, сработает

gedit "$(locate filename.sh)"

Или, как указывает Хеннес, если имя файла указано в переменной PATH:

gedit "$(which filename.sh)"

Есть еще одна проблема с обоими вариантами: оболочка удаляет завершающие переносы строк из подстановки команд, $(...). Так что в патологическом случае, когда имя вашего файла заканчивается переносами строк, это не удастся.

Общее решение

Чтобы избежать этих проблем, попробуйте:

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

Это откроет вкладку geditдля каждого найденного файла.

Опция -0говорит, locateчто нужно вернуть список имен файлов, разделенных нулем. Опция --nullговорит xargs, что нужно интерпретировать входные данные как список, разделенный нулем. Следовательно, это будет работать с именами файлов с символами новой строки или другими сложными символами.

Для удобства вы можете создать функцию оболочки:

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

И используйте его как:lge filename.sh

Чтобы сделать определение функции постоянным, поместите его в свой ~/.bashrc.

Связанный контент