Bash “怎么做?”;var=>;(…)somecommand“;工作 #1 f(){ 类别“$1”>“$x” } #2 x=>(tr'[:lower:''[:upper:'])f(tr'[:lower:'[:upper:'])或f
单个命令可以有任意数量的Bash “怎么做?”;var=>;(…)somecommand“;工作 #1 f(){ 类别“$1”>“$x” } #2 x=>(tr'[:lower:''[:upper:'])f(tr'[:lower:'[:upper:'])或f,bash,process-substitution,Bash,Process Substitution,单个命令可以有任意数量的var=value前缀;这些变量将在该命令执行期间导出到环境中,以后不再存在。这不是特定于bash的,而是posixsh标准的一部分 “先执行哪个部分?”不是一个有意义的问题。首先启动其FIFO文件名(为/dev/fd条目和匿名FIFO(如果操作系统允许)存储在X中的进程替换,但执行是异步的。(这就是说,因为进程替换写入的输出被重定向为运行tr的进程的输入,带有echo的进程必然会阻塞,直到tr准备好读取它所写入的内容为止)。单个命令可以有任意数量的var=value前缀
var=value
前缀;这些变量将在该命令执行期间导出到环境中,以后不再存在。这不是特定于bash的,而是posixsh标准的一部分
“先执行哪个部分?”不是一个有意义的问题。首先启动其FIFO文件名(为
/dev/fd
条目和匿名FIFO(如果操作系统允许)存储在X中的进程替换,但执行是异步的。(这就是说,因为进程替换写入的输出被重定向为运行tr
的进程的输入,带有echo
的进程必然会阻塞,直到tr
准备好读取它所写入的内容为止)。单个命令可以有任意数量的var=value
前缀;这些变量将在该命令执行期间导出到环境中,以后不再存在。这不是特定于bash的,而是posixsh标准的一部分
“先执行哪个部分?”不是一个有意义的问题。首先启动其FIFO文件名(为
/dev/fd
条目和匿名FIFO(如果操作系统允许)存储在X中的进程替换,但执行是异步的。(这就是说,由于进程替换写入的输出被重定向为运行tr
的进程的输入,因此带有echo
的进程必然会阻塞,直到tr
准备好读取它正在写入的内容为止)。顺便说一句,一般来说,在变量中存储进程替换句柄并不特别安全。一旦进程替换的重定向离开作用域(在本例中,该作用域是单个命令),FIFO就会关闭,使句柄不再可用…如果运行{…此处多行块…;}3>(…)
,则您知道进程替换将在作用域中,并且在FD 3上可用,整个街区。与使用变量进行模糊化以及需要担心变量范围和流程替换的范围不同相比,更好的实践。(您在这里所做的是安全的,特别是因为赋值是单个命令的一部分,而不是复合命令,并且它的作用域是确保进程替换保持可用的单个命令;如果您使其x=>(tr'[:lower:'[:upper:']);f…呃,在我上面的评论中,这应该是{…;}3>>(…)
通常,顺便说一句,在变量中存储进程替换句柄并不特别安全。一旦进程替换的重定向离开作用域(在本例中,该作用域是单个命令),FIFO就会关闭,使句柄不再可用…如果运行{…此处的多行块…;}3>(…)
,那么您就知道您的流程替换将在作用域内,并且在FD 3上对整个区块都可用。这比使用变量和需要担心变量作用域和流程替换的作用域不同要好得多。(您在这里所做的是安全的,特别是因为赋值是单个命令的一部分,而不是复合命令,并且它的作用域是确保进程替换保持可用的单个命令;如果您使其x=>(tr'[:lower:'[:upper:']);f…呃,在我上面的评论中,这应该是{…;}3>>(…)
#1
f() {
cat "$1" >"$x"
}
#2
x=>(tr '[:lower:]' '[:upper:]') f <(echo 'hi there')