link para um executável e remova alguns parâmetros

2

Atualmente, estou usando o Xamarin Studio, que tem um bug nesta versão. Ele adiciona 2 parâmetros a um executável, o que faz com que a saída seja inundada com mensagens de erro, diminuindo o tempo de construção de um minuto para pelo menos 10 minutos.

Existe uma maneira de mover o executável original e criar um script bash ou um link, que remove os dois parâmetros problemáticos e os coloca em seu lugar?

Então Xamarin executaria o comando como de costume, mas os dois parâmetros infratores não seriam passados para o comando original.

diga que é /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 , gostaria de:

  1. Mover ibtool para ibtool_orig
  2. Coloque um link ou script no lugar de ibtool , o que remove os parâmetros incorretos e os transmite para ibtool_orig , me dando o seguinte comando:

/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 (observe que ibtool agora é ibtool_orig e --errors --warnings desapareceu)

Alguma idéia?

    
por user1009013 22.10.2015 / 15:08

2 respostas

2

O caminho canônico é um loop em forma de:

#! /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" "$@"

Você também pode substituir #! /bin/sh - pelo caminho ksh , zsh , yash ou bash e substituir exec por exec -a "$0" , então ibtool_orig ser passado /path/to/ibtool as argv[0] (que pode usar em suas mensagens de erro ou para se reexecutar).

    
por 23.10.2015 / 10:23
1
#!/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

Isso pressupõe que os parâmetros não terão nenhum caractere de shell especial, como aspas, colchetes etc .; manipulação que torna isso muito mais complicado e um script perl pode ser mais fácil:

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

Hmm, é um pouco mais curto também:)

    
por 22.10.2015 / 16:36