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


Я имею в виду это делать в 1-лайнере:

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

Я не могу понять, правильно ли это сделать


2
2017-10-28 20:52


Источник




Ответы:


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

Если есть только файл с именем 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,


6
2017-10-28 20:58



Ах, вот так. Я искал что-то вроде locate filename | gedit - Nitay
+1 для «патологического случая, когда ваше имя файла заканчивается новыми символами» - ernie
Если filename.sh находится на вашем пути, вы можете использовать это. Пример: gedit `which filename.sh` - Hennes
@Hennes Хорошая точка. Ответ обновлен. - John1024
И обновляется с правильным синтаксисом $ (). Я все еще склонен использовать обратные ссылки, но лучше $ (). - Hennes