我正在编写一个shell脚本,该脚本的功能类似于
Command1
Command1是一个闭源二进制文件,在其中,它执行类似的操作。
xcodebuild <some args>
<some magic>
xcodebuild <some different args>
<some magic again>
我想要做的是拥有一个自定义脚本,例如:
./xcodebuild-cleanup-script
在xcodebuild命令之后立即执行。但是由于我没有Command1二进制文件的源,所以我不能这样做。
有没有办法让我覆盖xcodebuild
命令,使其像我的自定义命令一样
新的xcodebuild
应该是:
xcodebuild
./xcodebuild-cleanup-script
有没有办法做到这一点?
答案 0 :(得分:1)
实现此目的的常规方法是将自己的包装器放在PATH
前面。假设Command1
没有内部硬编码的PATH
。
假设您的PATH
看起来像
/usr/local/bin:/usr/bin:/bin
并且xcodebuild
在/usr/local/bin
中,您可以在$HOME/bin/xcodebuild
中创建自己的包装器,并扩展PATH
以使$HOME/bin
在前面。
mkdir -p $HOME/bin
PATH=$HOME/bin:$PATH
然后在$HOME/bin/xcodebuild
中,您可以对路径进行硬编码,或者可能安装符号链接:
ln -s /usr/local/bin/xcodebuild $HOME/bin/xcodebuild.real
,并使用xcodebuild.real
在脚本中引用此命令。
#!/bin/sh
xcodebuild.real "$@"
rc=$?
xcodebuild-cleanup-script
exit $rc
也许您甚至可以将xcodebuild-cleanup-script
的功能全部移至该脚本。
如果您具有管理员权限,则可以在/usr/local/bin
中执行相同的操作:将xcodebuild
移至xcodebuild.real
并创建一个包装器,可能有条件地调用该包装器:
#!/bin/sh
xcodebuild.real "$@"
rc=$?
if [ "$run_xcodebuild_wrapper" ]; then
xcodebuild-cleanup-script
fi
exit $rc
现在,仅当环境变量xcodebuild-cleanup-script
设置为非空字符串时,才运行run_xcodebuild_wrapper
,否则将透明地运行xcodebuild.real
。即使Command1
将路径硬编码到xcodebuild
,也可以使用。
答案 1 :(得分:0)
由于xcodebuild的路径是硬编码的,并且您可能不被允许更改xcodebuild的行为以始终执行清理-由于其他工具可能希望在不清理的情况下使用它-因此,我想到了一个非常非常肮脏的把戏:
以建议的三元组重命名xcodebuild
的方式(例如,将其重命名为xcodebuild.real),并将shell脚本xcodebuild
放置在期望的位置,其内容如下:
#!/bin/bash
cleanup_script=./xcodebuild-cleanup-script
xcodebuild.real
[[ ${DO_XCODEBUILD_CLEANUP:-N} == Y ]] && [[ -x $cleanup_script ]] && $cleanup_script
现在,如果您运行
DO_XCODEBUILD_CLEANUP=Y Command1
它将进行清理。
答案 2 :(得分:0)
@tripleee的解决方案是正确的。我只是想分享我的做法。 我在脚本中添加了
export PATH=$(pwd)/scripts/xcode:$PATH
Command1
然后在scripts/xcode
目录中,创建了一个名为xcodebuild
的脚本,其中包含
/usr/bin/xcodebuild $@
# custom command
./xcodebuild-cleanup-script