链接到可执行文件并删除一些参数

链接到可执行文件并删除一些参数

我目前正在使用 Xamarin Studio,该版本有一个错误。它向可执行文件添加了 2 个参数,这导致输出中充斥着错误消息,从而将构建时间从一分钟减慢到至少 10 分钟。

有没有办法可以移动原始可执行文件并创建 bash 脚本或链接,从而删除 2 个有问题的参数,并将其放在原来的位置?

因此 Xamarin 将照常运行该命令,但 2 个有问题的参数不会传递给原始命令。

说是/usr/bin/ibtool --errors --warnings --notices --output-format xml1 --minimum-deployment-target 7.0 --target-device iphone --target-device ipad --auto-activate-custom-fonts --sdk iPhoneSimulator9.0.sdk --compilation-directory Main.storyboard,我想:

  1. 搬去ibtoolibtool_orig
  2. 将链接或脚本放在 的位置ibtool,这会删除有问题的参数并将其传递给ibtool_orig ,从而给出以下命令:

/usr/bin/ibtool_orig --errors --output-format xml1 --minimum-deployment-target 7.0 --target-device iphone --target-device ipad --auto-activate-custom-fonts --sdk iPhoneSimulator9.0.sdk --compilation-directory Main.storyboard(注意ibtool现在ibtool_orig已经--errors --warnings消失了)

有任何想法吗?

答案1

规范的方式是一个循环,形状如下:

#! /bin/sh -
for i do # loop over the positional parameters
  case $i in
    --notices|--warnings) ;;
    *) set -- "$@" "$i" # append to the end of the positional parameter
                        # list if neither --notices nor --warnings
  esac
  shift # remove from the head of the positional parameter list
done
exec "${0}_orig" "$@"

您还可以替换#! /bin/sh -kshzsh或路径yashbash并替换execexec -a "$0"so ibtool_origbe pass /path/to/ibtoolas argv[0](它可能在其错误消息中使用或重新执行自身)。

答案2

#!/bin/sh
new='/usr/bin/ibtool_orig'
for i; do
    if [ "$i" = --errors ] || [ "$i" = --warnings ]; then
        : # skip these
    else
        new="$new $i"
    fi
done
exec $new

这假设参数不会有任何特殊的 shell 字符,例如引号、括号等;处理使这变得更加复杂,然后 perl 脚本可能会更容易:

#!/usr/bin/perl
my @new = grep(!/^--(errors|warnings)\z/, @ARGV);
exec '/usr/bin/ibtool_orig', @new;

嗯,也短了一点:)

相关内容