如何让Shell中自定义函数支持Pipe符号

2023-11-22 11:11:50
标签: read grep shell pipe

我们知道在Shell中,管道相当好用。但是如何让自己写的函数能支持管道,从之前的方法中得到输入,并执行是个问题。

经过实验,需要用read从管道中读取,然后使用。示例代码如下。

这里是最外层的调用

echo "##### Move Resources under Frameworks #####"

pushd ./Contents

if [ -d ./Frameworks/A360 ]

then

searchAndMoveResources ./Frameworks/A360

fi

popd

具体函数实现如下

searchAndMoveResources()

{

find $1 ! -name "*.dylib" -and ! -name "*.so" -and ! -name ".DS_Store" -and ! -name "*.a" -type f -print0 | xargs -P $NCPU -0 -L1 file | grep -v -E "Mach-O .*" | cut -d ":" -f1 | movetoResources

}

movetoResources才是关键,它从管道中读取输入,然后执行。实现如下

movetoResources()

{

read source_file

while [[ ! -z $source_file ]]

do

target_file=${source_file/.\/Frameworks/.\/Resources}

target_dir=`dirname $target_file`

mkdir -p $target_dir

mv $source_file $target_file

link_target_file=${source_file/.\/Frameworks/Resources}

repeat=`echo $target_file | grep -o "/" | wc -l`

count=1

until [ ! $count -lt $repeat ]

do

count=`expr $count + 1`

link_target_file="../"$link_target_file

done

ln -s $link_target_file $source_file

read source_file

done

}

其中

target_file=${source_file/.\/Frameworks/.\/Resources}

可以把./Frameworks替换成./Resources

conanchen@ConanChen Release % echo $source_file

./Frameworks/AIRMAX/expr

conanchen@ConanChen Release % target_file=${source_file/.\/Frameworks/.\/Resources}

conanchen@ConanChen Release % echo $target_file

./Resources/AIRMAX/expr

再后面一段,把原来位置的文件改成symbol link指向新的文件。循环是因为要把Resources和Frameworks放成同一级目录。

source_file本身可能在Frameworks中不同的层级,因此要根据/符号的深浅来动态决定symbol link的层级。

有可能是../../Resource/ABC/ABC或者../../../Resources/ABC/ABC/ABC

这里的grep一定要-o,严格分开Match,否则结果不正确。

conanchen@ConanChen Release % echo $target_file | grep "/"

./Resources/AIRMAX/expr

conanchen@ConanChen Release % echo $target_file | grep -o "/"

/

/

/


阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有