Swizzle Shell命令

时间:2019-02-08 01:47:56

标签: bash shell

我正在编写一个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

有没有办法做到这一点?

3 个答案:

答案 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