GNU/Linux >> Linux Esercitazione >  >> Linux

I backtick (cioè `cmd`) in *sh Shells sono stati deprecati?

Ho visto questo commento molte volte su Unix e Linux così come su altri siti che usano la frase "i backtick sono stati deprecati", rispetto a shell come Bash e Zsh.

Questa affermazione è vera o falsa?

Risposta accettata:

Esistono due diversi significati di "obsoleto".

essere ritirato: (principalmente di una funzionalità software) essere utilizzabile ma considerato obsoleto ed è meglio evitarlo, in genere perché è stato sostituito.

—Nuovo dizionario americano di Oxford

Con questa definizione i backtick sono deprecato.

Lo stato obsoleto può anche indica che la funzione verrà rimossa in futuro.

—Wikipedia

In base a questa definizione, i backtick non deprecato.

Ancora supportato:

Citando la specifica Open Group sui linguaggi di comando della shell,
in particolare la sezione "2.6.3 Sostituzione dei comandi", si può vedere che entrambe le forme di sostituzione dei comandi, i backtick (`..cmd..` ) o parentesi in dollari ($(..cmd..) ) sono ancora supportati per quanto riguarda le specifiche.

estratto

La sostituzione del comando consente di sostituire l'output di un comando al posto
del nome del comando stesso. La sostituzione del comando avviene quando il comando
è racchiuso come segue:

          $(command)

          or (backquoted version):

          `command`

La shell espanderà la sostituzione del comando eseguendo il comando in un ambiente di sottoshell
(vedi Ambiente di esecuzione della shell) e sostituendo la sostituzione del comando
(il testo del comando più il $() o
backquotes) con lo standard output del comando, rimuovendo le sequenze di uno
o più caratteri al termine della sostituzione. I caratteri incorporati prima della fine dell'output non devono essere rimossi; tuttavia,
possono essere trattati come delimitatori di campo ed eliminati durante la suddivisione dei campi,
a seconda del valore di IFS e delle virgolette in vigore. Se l'output
contiene byte null, il comportamento non è specificato.

All'interno dello stile backquoted di sostituzione dei comandi, conserva
il suo significato letterale, tranne quando seguito da:'$', '` ', o . La
ricerca della quotazione precedente corrispondente deve essere soddisfatta dalla prima quotazione precedente non quotata
senza escape; durante questa ricerca, se viene rilevato un backquote senza escape
all'interno di un commento della shell, un here-document, un comando incorporato
sostituzione del $(comando) form o una stringa tra virgolette, si verificano risultati non definiti
. Una stringa tra virgolette singole o doppie che inizia, ma non finisce,
all'interno di "`...` ” la sequenza produce risultati indefiniti.

Con il $(comando) modulo, tutti i caratteri che seguono la parentesi aperta alla
la parentesi chiusa corrispondente costituiscono il comando. Qualsiasi script di shell
valido può essere utilizzato per i comandi, ad eccezione di uno script costituito esclusivamente da
reindirizzamenti che producono risultati non specificati.

Allora perché tutti dicono che i backtick sono stati deprecati?

Perché la maggior parte dei casi d'uso dovrebbe utilizzare il modulo dei genitori del dollaro invece dei backtick. (Deprecato nel primo senso sopra.) Molti dei siti più rinomati (incluso U&L) spesso affermano anche questo, in tutto, quindi è un buon consiglio. Questo consiglio non deve essere confuso con un piano inesistente per rimuovere il supporto per i backtick dalle shell.

  • BashFAQ #082 – Perché $(…) è preferito a `…` (backtick)?

    estratto

    `...` è la sintassi legacy richiesta solo dalle bourne shell più vecchie di
    non compatibili con POSIX. Ci sono diversi motivi per
    preferire sempre $(...) sintassi:

  • Bash Hackers Wiki:sintassi obsoleta e deprecata

    estratto

    Questa è la vecchia forma compatibile con Bourne della sostituzione del comando.
    Entrambi i `COMMANDS` e $(COMANDI) le sintassi sono specificate da POSIX,
    ma quest'ultimo è ottimo preferito, sebbene il primo sia purtroppo
    ancora molto diffuso negli script. Le sostituzioni dei comandi di nuovo stile sono ampiamente
    implementate da ogni shell moderna (e poi da alcune). L'unico motivo per utilizzare
    i backtick è la compatibilità con una vera shell Bourne (come Heirloom).
    Le sostituzioni dei comandi backtick richiedono un escape speciale quando nidificate e
    gli esempi trovati in natura sono citati in modo improprio altro spesso. Vedi:Perché $(…) è preferito a `…` (backtick)?.

  • Motivazione standard POSIX

    estratto

    A causa di questi comportamenti incoerenti, la varietà di sostituzioni di comandi con virgolette non è consigliata per le nuove applicazioni che annidano sostituzioni di comandi o tentano di incorporare script complessi.

NOTA: Questo terzo estratto (sopra) mostra diverse situazioni in cui i backtick semplicemente non funzionano, ma il nuovo metodo delle parentesi in dollari funziona, a cominciare dal paragrafo seguente:

Inoltre, la sintassi con virgolette ha restrizioni storiche sul contenuto del comando incorporato. Mentre il modulo "$()" più recente può elaborare qualsiasi tipo di script incorporato valido, il modulo con virgolette non può gestire alcuni script validi che includono virgolette.

Se continui a leggere quella sezione, gli errori vengono evidenziati mostrando come fallirebbero usando i backtick, ma funzionano usando la più recente notazione di parentesi del dollaro.

Correlati:come posizionare la mano per premere i tasti Comando (cmd) + Opzione (alt)?

Conclusioni

Quindi è preferibile utilizzare le parentesi in dollari anziché i backtick, ma in realtà non stai utilizzando qualcosa che è stato tecnicamente "deprecato" come in "questo smetterà di funzionare completamente a un certo punto".

Dopo aver letto tutto questo, dovresti sapere che sei fortemente incoraggiato a usare le parentesi in dollari a meno che tu non specificamente richiedono la compatibilità con una vera shell Bourne originale non POSIX.


Linux
  1. Sostituzione dei comandi usando “?

  2. Come applicare la digitazione preliminare alla ricerca nella cronologia di Bash (ctrl-r)?

  3. Esempi di creazione di alias di comando in diverse shell

  4. Il comando "java" non esegue la JVM che è stata installata

  5. Trova i file che sono stati modificati nelle ultime 24 ore

Come scoprire da quanto tempo è in esecuzione un processo in Linux

Terminali, shell, console e righe di comando

Trucco del terminale Linux:hackerare il comando cd per ricordare dove sei stato

3 comandi Linux di cui ti sei dimenticato

Un comando Linux può avere lettere maiuscole?

Bash ha un comando di colore, come visto in MS-Windows CMD?