这是这个问题的后续问题
在那个问题中,我可以将选定的文件放入一个数组并将它们传递给一个命令/函数(已经导出)。这个问题的不同之处在于我希望用户在选择文件后完成命令。
主要目标:我看到一个文件名列表 (FZF)。我手动选择其中一些。FZF 然后将这个子集放入一个数组中。然后我想编写一个未完成的命令,希望用户完成命令并按Enter
。
文件名中可以有空格;因此选择Null-separated。
我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
and 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 出了点问题。
如何修复代码?