Как использовать вывод команды в качестве аргумента для следующей команды в Bash: пошаговое руководство

Как эффективно использовать вывод команды find для редактирования файлов в vim

В командной строке Linux часто возникают задачи быстрого поиска файлов и их последующего редактирования. Примером может служить поиск конфигурационных файлов docker-compose.yml и открытие их в редакторе vim в режиме только для чтения (vim -R). В данной статье рассмотрим несколько способов решения такой задачи, включая использования переменных, пользовательских функций и трюков с терминалом.


Использование команды mkdir и переменной $_ — краткий пример

Часто в оболочке Bash можно видеть трюк с переменной $_, которая содержит последний аргумент предыдущей команды. Например, при создании папки и переходе в неё:

bash
mkdir somefolder
cd $

Переменная $_ подставляет some_folder из предыдущей команды. Однако стоит понимать, что этот трюк работает только с аргументами команд, а не с их выводом (stdout).


Невозможность напрямую использовать вывод команды find в последующих командах без переменной

Если вы пытаетесь выполнить команду поиска:

bash
find . -name "docker-compose*"

и затем сразу открыть найденный файл в vim:

bash
vim -R ???

то подставлять напрямую вывод find нельзя без дополнительной обработки. Почему?

  • Shell не сохраняет вывод внешней команды как переменную автоматически.
  • Последовательность вывода может быть разной по длине и количеству строк.
  • Использование | (пайпов) или xargs усложняет процесс и не всегда подходит, если вы хотите просто быстро скопировать-подставить путь.

Использование переменной для хранения результата поиска

Самый очевидный и простой способ — сохранить результат вывода в переменную:

bash
res=$(find . -name "docker-compose*")

Затем можно посмотреть содержимое переменной:

bash
echo "$res"

и открыть файл в vim, если результат только один:

bash
vim -R "$res"

Если найденных файлов несколько, переменную нужно обрабатывать иначе, чтобы не получить ошибку.


Автоматизация с помощью пользовательской функции в Bash

Чтобы упростить процесс и сделать его более удобным, можно написать функцию, которая:

  • Выполняет поиск
  • Если найден один файл — автоматически открывает его в vim
  • Если файлов несколько — выводит список

Пример функции vimfind:

bash
vimfind() {
local results=()
while IFS= read -r line; do
results+=("$line")
done < <(find . -name "$1")

if (( ${#results[@]} == 1 )); then
vim -R "${results[0]}"
elif (( ${#results[@]} > 1 )); then
printf ‘%s\n’ "${results[@]}"
else
echo "Ничего не найдено."
fi
}

Использование:

bash
vimfind "docker-compose*"

Эта функция значительно повышает удобство работы и снижает количество ошибок.


Автоматизация вставки последнего вывода команды с помощью tmux и Bash

В терминальном мультиплексоре tmux можно автоматизировать вставку последней строки вывода команды (например, результата find) прямо в командную строку.

Пример функции и привязки клавиш:

bash
_paste_last_output() {
local output
output="$(tmux capture-pane -pJ | grep -v ‘^$’ | grep -v ‘^user@.:.$ ‘ | tail -n 1)"
output="${output@Q}"
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${output}${READLINE_LINE:$READLINE_POINT:${#READLINE_LINE}}"
READLINE_POINT=$((READLINE_POINT + ${#output}))
}
bind -x ‘"\C-x\C-v":_paste_last_output’

  • Замените шаблон ^user@.*:.*$ под вашу командную строку.
  • После вызова функции сочетанием <Ctrl+x><Ctrl+v> последняя строка вывода будет вставлена в текущий ввод.
  • Это автоматизирует процесс копирования и вставки найденного пути без лишних действий.

Ограничения и нюансы самостоятельного копирования вывода

  • Переменная $_ не хранит вывод команды.
  • Не всегда можешь подставлять несколько результатов одной командой.
  • Автоматизация с tmux требует правильной настройки и понимания текущего окружения.
  • При нескольких найденных результатах лучше вывести список и выбрать нужный вручную.

Заключение

Для эффективного поиска и открытия файлов, например, docker-compose.yml, рекомендуются следующие практики:

  • Использование переменных для хранения вывода команды find.
  • Создание пользовательских функций для автоматизации рутины.
  • При необходимости использования терминальных мультиплексоров, таких как tmux — можно автоматизировать вставку вывода команд.
  • При большом количестве результатов лучше выводить их список и вручную выбирать нужный файл.

Используя описанные методы, вы заметно повысите скорость и удобство работы в терминале при редактировании найденных файлов.


Ключевые слова для SEO:

find, vim, bash, shell, команды linux, переменные bash, редактирование файлов, скрипты bash, tmux, автоматизация терминала, docker-compose, поиск файлов, пользовательские функции bash

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *