Это дополнительный вопрос к этому вопросу
В этом вопросе я могу получить выбранные файлы в массив и передать их команде / функции (уже экспортированной). Этот вопрос отличается тем, что я хотел бы, чтобы пользователь выполнил команду после выбора файлов.
Основная цель: мне представлен список имен файлов (FZF). Я вручную выбираю некоторые из них. FZF затем помещает это подмножество в массив. Затем я хочу составить незаконченную команду, которая ожидает, что пользователь выполнит команду и нажмет Enter
.
В именах файлов могут быть пробелы; отсюда и выбор разделенных нулями.
Я использую FZF
для выбора файлов. Я думаю, что он создает массив, содержащий имена файлов с нулевым окончанием. Но первым элементом, который производит FZF
, является имя нажатия клавиши. Вот почему скрипт обрабатывает первый элемент вывода FZF
по-разному.
В настоящее время у меня есть
#!/bin/bash
readarray -d '' out < <(fd .|fzf --print0 -e -m --expect=ctrl-e,ctrl-l)
if [ ${#out[@]} -eq 0 ]; then return 0
fi
declare -p out
key="$out"
y=${out[@]:1}
if [ ${#y[@]} -eq 0 ]; then return 0
fi
case "$key" in
ctrl-e ) echo do something ;;
ctrl-l ) echo do something else ;;
* )
printf -v array_str '%q ' "${y[@]}"
cmd="printf '%s\0' ${array_str} | parallel -0 wc"
read -e -i "$cmd" cmd_edited; eval "$cmd_edited" ;; #not working
esac
Я подошел близко: команда выглядит так, как должно, но NUL ценности не ведут себя. Последняя строка не работает. Он предназначен для печати массива файлов в строке с нулевым разделителем и, тем не менее, позволяет пользователю указывать функцию (уже экспортированную) перед нажатием Enter
. Команда parallel
применила бы функцию к каждому файлу в массиве.
$ls
file 1
file 2
...
...
file 100
В настоящее время, если я выберу file 3
и file 2
, вывод моего скрипта будет выглядеть следующим образом:
printf "%s\0" file 3 file 2 | parallel -0
, к которому я мог бы, например, добавить wc
Но потом, после того как я наберу wc
и нажал Enter
, я получил следующий результат:
printf "%s\0" file 3 file 2 | parallel -0 wc
wc: file030file020: No such file or directory
Редактировать : Теперь я включил строку declare -p out
, чтобы прояснить, что производит FZF. Результаты в том виде, в каком они сейчас отображаются, с использованием приведенной ниже модификации Чарльза:
declare -a out=([0]="" [1]="file 3" [2]="file 2" [3]="file 1")
printf '%s\0' file\ 3\ file\ 2\ file\ 1 | parallel -0 wc
wc: file030file020file010: No such file or directory
Итак, что-то явно пошло не так с nuls.
Как мне исправить код?