我目前正在使用 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
,我想:
- 搬去
ibtool
ibtool_orig
- 将链接或脚本放在 的位置
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 -
为ksh
、zsh
或路径yash
,bash
并替换exec
为exec -a "$0"
so ibtool_orig
be pass /path/to/ibtool
as 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;
嗯,也短了一点:)