在bash中,是否有比将进程替换和echo -n
传递变量作为文件参数更好的方法?
v1='...'
v2='...'
comm <(echo -n "$v1") <(echo -n "$v2")
以下内容适用于一个文件参数,但会增加一些可读性:
comm <(echo -n "$v1") - <<<"$v2"
也许更快一点?是否有2个以上文件的更好选择?基本上,我正在寻找v1=$(<filename)
的反义词。
答案 0 :(得分:1)
$ v1=$(seq 1 3); v2=$(seq 2 4)
$ comm /dev/fd/3 3<<<"$v1" /dev/fd/4 4<<<"$v2"
1
2
3
4
在上面的3<<<"$v1"
和4<<<"$v2"
中,文件描述符3和4指向由<<<
生成的临时文件,然后在这些文件描述符上运行comm
。使用awk,您可以看到发生这种情况:
$ awk 'BEGIN{for (i in ARGV) print i, ARGV[i]} {print FILENAME, $0}' /dev/fd/3 3<<<"$v1" /dev/fd/4 4<<<"$v2"
0 awk
1 /dev/fd/3
2 /dev/fd/4
/dev/fd/3 1
/dev/fd/3 2
/dev/fd/3 3
/dev/fd/4 2
/dev/fd/4 3
/dev/fd/4 4
如果您发现其他更易读的排列并且可以继续进行,则可以更改FD分配与用法的命令行顺序,例如:
$ v3=$(seq 4 6); v4=$(seq 6 8)
$ paste /dev/fd/3 3<<<"$v1" /dev/fd/4 4<<<"$v2" /dev/fd/5 5<<<"$v3" /dev/fd/6 6<<<"$v4"
1 2 4 6
2 3 5 7
3 4 6 8
但是您应该真正质疑为什么要这样做,如果您发现自己正在考虑这样做的话,那么有什么更好的方法可以解决您真正需要做的事情。
答案 1 :(得分:0)
我可能听不懂,但看来您想得太过分了。
awk '{print $2}' "$v1" "$v2"
如果{v1}和{v2}不是文件名,而是数据,则可以使用heredoc:
awk '{print $2}' <<EOF
$v1
$v2
EOF
或此处字符串:
awk '{print $2}' RS=: <<< "$v1:$v2"