Bash允许使用: cat <(echo "$FILECONTENT")
Bash还允许使用: while read i; do echo $i; done </etc/passwd
结合前两个可以使用: echo $FILECONTENT | while read i; do echo $i; done
最后一个问题是它创建了子shell,而在while循环结束后,变量i不再被访问.
我的问题是:
如何实现这样的目标:while read i; do echo $i; done <(echo "$FILECONTENT")或者换句话说:我怎样才能确定i循环中存活?
请注意我知道封闭while语句{}但这并不能解决问题(想象一下你想在函数中使用while循环并返回i变量)
使用find . -print0似乎是获取bash中文件列表的唯一安全方法,因为文件名可能包含空格,换行符,引号等.
但是,我很难让find的输出在bash或其他命令行实用程序中有用.我设法使用输出的唯一方法是将它传递给perl,并将perl的IFS更改为null:
find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'
Run Code Online (Sandbox Code Playgroud)
此示例打印找到的文件数,避免文件名中的换行符损坏计数的危险,如下所示:
find . | wc -l
Run Code Online (Sandbox Code Playgroud)
由于大多数命令行程序不支持空分隔输入,我认为最好的方法是捕获find . -print0bash数组中的输出,就像我在上面的perl片段中所做的那样,然后继续执行任务,无论它是什么是.
我怎样才能做到这一点?
这不起作用:
find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )
Run Code Online (Sandbox Code Playgroud)
一个更普遍的问题可能是:如何用bash中的文件列表做有用的事情?
我试图理解使用圆括号和大括号的shell子进程调用之间的区别.我认为大括号不会启动子进程,但似乎它们确实启动了一个子进程.
#!/bin/sh
a=1
b=1
( a=2; ) | ( a=3; )
{ b=2; } | { b=3; }
echo "a=$a"
echo "b=$b"
Run Code Online (Sandbox Code Playgroud)
打印此脚本
a=1
b=1
Run Code Online (Sandbox Code Playgroud)
所以似乎所有调用都在子进程内运行.在这种背景下他们之间有什么区别吗?我明白,如果我会用&&和||,则{..}不会启动子,但我想了解的管道是如何工作的.