Esiste uno standard che copre la portabilità dell'esecuzione di un comando dopo l'assegnazione di variabili sulla stessa riga?
APPLE="cider" echo hi
Quanto è portatile una cosa del genere? Dove funzionerà e dove no?
Inoltre:i miei script di shell iniziano con #!/bin/sh se questo fa la differenza.
Risposta accettata:
Finché utilizzi una shell conforme a POSIX, sì.
Dalla definizione POSIX del linguaggio dei comandi della shell:(punti rilevanti in grassetto)
Un "comando semplice" è una sequenza di assegnazioni di variabili opzionali e reindirizzamenti, in qualsiasi sequenza, eventualmente seguiti da parole e reindirizzamenti, terminati da un operatore di controllo.
Quando è necessario eseguire un determinato comando semplice (ovvero, quando qualsiasi costrutto condizionale come un elenco AND-OR o un'istruzione case non ha ignorato il comando semplice), le seguenti espansioni, assegnazioni e reindirizzamenti devono essere tutti eseguiti da dall'inizio del testo del comando alla fine:
-
Le parole riconosciute come assegnazioni variabili o i reindirizzamenti in base alle regole grammaticali della shell vengono salvati per l'elaborazione nei passaggi 3 e 4.
-
Le parole che non sono assegnazioni variabili o reindirizzamenti devono essere espanse. Se qualche campo rimane dopo la sua espansione, il primo campo è considerato il nome del comando ei campi rimanenti sono gli argomenti per il comando.
-
I reindirizzamenti devono essere eseguiti come descritto in Reindirizzamento.
-
Ogni assegnazione di variabile deve essere espansa per l'espansione della tilde, l'espansione dei parametri, la sostituzione dei comandi, l'espansione aritmetica e la rimozione delle virgolette prima di assegnare il valore.
Nell'elenco precedente, l'ordine delle fasi 3 e 4 può essere invertito per l'elaborazione di speciali utilità integrate; vedi Utilità integrate speciali.
Se non risulta alcun nome di comando, le assegnazioni delle variabili influiranno sull'ambiente di esecuzione corrente. In caso contrario, le assegnazioni delle variabili verranno esportate per l'ambiente di esecuzione del comando e non influiranno sull'ambiente di esecuzione corrente (tranne per gli speciali built-in).
Inoltre, sì #!/bin/sh
importa. Dalla definizione POSIX di sh
:
L'utilità sh è un interprete del linguaggio dei comandi che eseguirà i comandi letti da una stringa della riga di comando, dallo standard input o da un file specificato. L'applicazione garantisce che i comandi da eseguire siano espressi nella lingua descritta in Shell Command Language .
Quindi in pratica dice che sh
deve seguire le regole di cui sopra.
Quindi, finché sei su un sistema operativo conforme a POSIX, sei a posto.