GNU/Linux >> Znalost Linux >  >> Linux

Byly backticks (tj. `cmd`) v *sh Shellech zastaralé?

Viděl jsem tento komentář mnohokrát na Unixu a Linuxu a také na jiných webech, které používají frázi „backticks byly zastaralé“, s ohledem na shelly, jako je Bash &Zsh.

Je toto tvrzení pravdivé nebo nepravdivé?

Přijatá odpověď:

Existují dva různé významy slova „zastaralé“.

zastaralé: (především softwarové funkce) být použitelné, ale považovány za zastaralé a je lepší se jim vyhnout, obvykle kvůli tomu, že byly nahrazeny.

—Nový oxfordský americký slovník

Podle této definice zpětné značky jsou zastaralé.

Zastaralý stav může také označte, že funkce bude v budoucnu odstraněna.

— Wikipedie

Podle této definice zpětná zaškrtnutí nejsou zastaralé.

Stále podporováno:

S odkazem na specifikaci otevřené skupiny pro jazyky příkazů Shell,
konkrétně sekci „2.6.3 Náhrada příkazů“, lze vidět, že obě formy substituce příkazů, zpětné zaškrtnutí (`..cmd..` ) nebo dolarové závorky ($(..cmd..) ) jsou stále podporovány, pokud jde o specifikace.

úryvek

Nahrazení příkazu umožňuje nahrazení výstupu příkazu na místo
samotného názvu příkazu. K nahrazení příkazu dojde, když je příkaz
uzavřen následovně:

          $(command)

          or (backquoted version):

          `command`

Shell rozšíří substituci příkazu provedením příkazu v
prostředí subshell (viz prostředí Shell Execution Environment) a nahrazením
substituce příkazu (text příkazu plus přiložený $() nebo
zpětné uvozovky) se standardním výstupem příkazu, odstraněním sekvencí jednoho
nebo více znaků na konci substituce. Vložené znaky před koncem výstupu nebudou odstraněny; nicméně
mohou být považovány za oddělovače polí a mohou být odstraněny během rozdělování polí,
v závislosti na hodnotě IFS a citaci, která je účinná. Pokud výstup
obsahuje nějaké prázdné bajty, chování není specifikováno.

V rámci zpětně citovaného stylu substituce příkazů si zachová
svůj doslovný význam, kromě případů, kdy následuje:„$“, „` ‘ nebo .
hledání odpovídající zpětné uvozovky musí být uspokojeno první neuvozenou
neuvedenou zadní uvozovkou; Pokud se během tohoto hledání
setkáte s neuvedenou zpětnou uvozovkou v komentáři shellu, dokumentu zde, vloženém příkazu
nahrazení $(command) formulář nebo řetězec v uvozovkách se vyskytují nedefinované výsledky
. Řetězec v jednoduchých nebo dvojitých uvozovkách, který začíná, ale nekončí,
uvnitř „`...` ” sekvence produkuje nedefinované výsledky.

Pomocí $(command) příkaz tvoří všechny znaky následující za otevřenou závorkou
odpovídající uzavírací závorce. Pro příkaz lze použít jakýkoli platný shell
skript, kromě skriptu sestávajícího výhradně z
přesměrování, které produkuje nespecifikované výsledky.

Tak proč všichni říkají, že zpětné zaškrtnutí bylo ukončeno?

Protože většina případů použití by měla používat formulář dolarových závorek namísto zpětných znamének. (Zavrženo v prvním smyslu výše.) Mnoho z nejuznávanějších webů (včetně U&L) to často uvádí také, takže je to rozumná rada. Tato rada by neměla být zaměňována s nějakým neexistujícím plánem na odstranění podpory pro backtick ze skořápek.

  • BashFAQ #082 – Proč je $(…) preferován před `…` (backticks)?

    úryvek

    `...` je starší syntaxe vyžadovaná pouze těmi úplně nejstaršími
    bourne shelly, které nejsou kompatibilní s POSIX. Existuje několik důvodů, proč vždy
    preferovat $(...) syntaxe:

  • Bash Hackers Wiki – Zastaralá a zastaralá syntaxe

    úryvek

    Toto je starší forma náhrady příkazu kompatibilní s Bourne.
    Oba `COMMANDS` a $(COMMANDS) syntaxe jsou specifikovány POSIX,
    ale druhý je skvěle preferovaný, ačkoli první je bohužel
    ve skriptech stále velmi rozšířený. Náhrady příkazů nového stylu jsou široce
    implementovány každým moderním shellem (a pak některými). Jediným důvodem pro použití
    backtick je kompatibilita se skutečným Bourne shellem (jako je Heirloom).
    Náhrady příkazů Backtick vyžadují speciální escapování, když jsou vnořeny, a
    příklady nalezené v divočině jsou nesprávně citovány. často než ne. Viz:Proč je $(…) upřednostňován před `…` (backticks)?.

  • Standardní zdůvodnění POSIX

    úryvek

    Kvůli tomuto nekonzistentnímu chování se zpětně citovaná řada náhrad příkazů nedoporučuje pro nové aplikace, které vnořují náhrady příkazů nebo se pokoušejí vkládat složité skripty.

POZNÁMKA: Tento třetí úryvek (výše) dále ukazuje několik situací, kdy zpětné zaškrtnutí jednoduše nebude fungovat, ale novější metoda dolarových závorek ano, počínaje následujícím odstavcem:

Kromě toho má zpětně citovaná syntaxe historická omezení obsahu vloženého příkazu. Zatímco novější formulář „$()“ dokáže zpracovat jakýkoli druh platného vloženého skriptu, formulář s uvozovkami nedokáže zpracovat některé platné skripty, které obsahují zpětné uvozovky.

Pokud budete pokračovat ve čtení této části, selhání jsou zvýrazněna, což ukazuje, jak by selhalo při použití zpětných značek, ale pracujte s použitím novějšího zápisu dolarových závorek.

Související:Jak umístit ruku, abyste stiskli klávesy Command (cmd) + Option (alt)?

Závěry

Je tedy vhodnější používat dolarové závorky místo zpětných zatržení, ale ve skutečnosti nepoužíváte něco, co bylo technicky „zastaralé“, jako například „toto v určitém plánovaném okamžiku přestane úplně fungovat.“

Po přečtení tohoto všeho byste si měli uvědomit, že vám důrazně doporučujeme používat dolarové závorky, pokud konkrétně vyžadují kompatibilitu se skutečným originálním Bourne shellem, který není POSIX.


Linux
  1. Jak používat příkaz Coproc v různých skořápkách?

  2. Jak vypsat všechny soubory, které byly nainstalovány balíčkem Apt?

  3. Příkaz „java“ nespustí JVM, který byl nainstalován

  1. Jak zajistit, aby se příkaz Linux ls zobrazoval jako druhý v časové značce

  2. Vypočítejte, kolik místa na disku by bylo využito

  3. Může mít příkaz Linux velká písmena?

  1. Získání všech souborů, které byly upraveny ke konkrétnímu datu?

  2. Má bash příkaz color, jak je vidět v MS-Windows CMD?

  3. Divné SSH, zabezpečení serveru, mohl jsem být hacknutý