Come liberare il software dual-platform senza 'grep -P' per Mac OS?

0

Ho un software open source che sto pianificando per il rilascio che invoca grep -nP tramite la riga di comando. (Sì, questa è probabilmente una decisione terribile.)

Il problema che sto incontrando è che mentre questo funziona alla grande su Linux, le mie funzioni falliscono su Mac OS, perché grep -P non funziona come previsto su Mac. Riceverò il seguente errore:

usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]

link

Nel link sopra riportato, Homebrew apparentemente lo installa come "ggrep".

Dato questo problema, come posso rilasciare questo software in modo che funzioni su entrambe le piattaforme?

Richiedi la modifica di "grep" nel profilo bash dell'utente? Requisiti Gli utenti Mac OS devono interferire con il codice sorgente?

Qualsiasi aiuto con questo problema "NP" di grep è stato apprezzato

    
posta ShanZhengYang 03.03.2018 - 23:51
fonte

1 risposta

1

Durante la scrittura del codice multipiattaforma, hai due possibilità:

  • scegli come target uno standard comune supportato da tutte le piattaforme targetizzate o
  • scrivi un codice separato per ciascuna piattaforma di destinazione.

Lo standard comune per i sistemi Unix è POSIX. Questo standard richiede quali funzionalità per determinati strumenti da riga di comando devono essere disponibili, incluso grep . Notare che POSIX grep non fornisce regex per PCRE, ma supporta espressioni regolari "estese". Questi possono essere sufficienti per il tuo caso d'uso, ma hanno una sintassi leggermente diversa e molte meno funzioni.

Quando si fa lo sviluppo su un sistema Linux, è facile dipendere accidentalmente dalle varie estensioni dei programmi di utilità GNU. È quindi importante testare anche su sistemi in cui non sono installate utilità GNU e leggere lo standard per sapere quali funzioni sono garantite.

In alternativa, è possibile richiedere le utilità GNU come dipendenza del software, ma ciò può causare inconvenienti inutilmente agli utenti. Potrebbe anche essere preferibile dipendere da altri software non POSIX, come un linguaggio di programmazione ampiamente disponibile. Perl e Python sono ampiamente preinstallati o facilmente disponibili per molti sistemi Unix. Perl rende un motore regex di prim'ordine facilmente disponibile per i programmi da riga di comando.

Non è necessario che l'utente alias gli strumenti GNU su un nome specifico se si rende il software sufficientemente configurabile, ad es. attraverso una variabile di ambiente. In questo caso, risolverei l'utilità grep tramite questo meccanismo:

if an env variable GREP exists:
  use the env variable GREP
if not on Linux:
  if a ggrep utility exists:
    use the ggrep utility
use the grep utility

Ho usato strategie simili durante la scrittura di script di shell multipiattaforma per Linux e Solaris, che (come macOS) ha solo le utilità GNU disponibili come installazione separata.

    
risposta data 04.03.2018 - 00:41
fonte

Leggi altre domande sui tag