2017-06-28 38 views
0

有没有捕捉传递到使用$(cat)[email protected]脚本参数之间有什么区别?

例如是这样的有什么不同

my_data=$(cat) 
echo "$my_data" | "$my_script" 

不是执行

"$my_script" "[email protected]" 

我跑的时候问这个,因为我发现了一个情况下$(cat)没有catenating它的标准输入到stdout像它应该git钩子。因此它没有捕获参数,但是,[email protected]没有问题。

+1

'cat'是外部程序,并产生不必要的子进程。如果你想阅读stdin,然后使用shell内置'read'。 '$ @''是命令行参数,并且与标准输入不连接。 – cdarke

回答

3

这是完全没有意义的:

my_data=$(cat) 
echo "$my_data" | "$my_script" 

如果$my_script读取标准输入,那么这将是大致相当于:

"$my_script" 

这是正确的,没有cat,没有echo。如果第一个例子工作,这也应该起作用,除了第一个版本由于echo而增加了一个额外的换行符之间的微小差别。

你的问题似乎是关于通过输入到程序的不同方式。一种方法是传递标准输入。例如:

cat data.txt | prog 
prog < data.txt 

在这些实例中,prog可以读取的data.txtstdin的内容。如果存在多个不同的值,则prog必须适当地解析输入以分离值。

另一种方式来传递输入到节目是经由命令行参数,例如:

prog a "b c" 

在这个例子中外壳将通过两个值的程序,并且该程序可以直接访问的那些值,而无需任何解析。

通过标准输入传递了,你可以逐字传递大量数据的优势。通过命令行参数传递的优点是,您可以传递不同的值而不必解析它们。它的缺点是命令行有长度限制,并且您必须小心地转义可能由shell解释的值。

您可以使用哪种方法更适合您的任务。如果这对您的程序有意义,您也可以同时使用两者。