我们知道在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
"/"
/
/
/
如何让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 "/"
/
/
/