Nedávno jsem použil příkaz echo, který jej předponoval $. K mému překvapení to vedlo k chybě. Můj příkaz byl něco takového.

# !/bin/bash $(echo "a") 

Chyba byla ..

./test1.sh: line 3: a: command not found 

Může někdo vysvětlit, co se tady děje. Předem děkujeme.

Odpověď

$(echo a) je „nahrazení příkazu“. $(...) bude nahrazen výstupem příkazu uvnitř . Výstupem v tomto případě je a, který se shell pokusí spustit. Prostředí nemůže najít příkaz s názvem a a zobrazí se chybová zpráva.

Není jasné, jaký byl váš záměr s tímto záměrem nebo co jste očekávali. . Je velmi neobvyklé chtít provést výsledek substituce příkazu.


Některé programy produkují řetězce, které by měl shell vyhodnotit. Je proto možné viz kód jako

eval "$(ssh-agent)" 

který vyhodnocuje (spouští) výstup daného příkazu. Tyto příkazy mají přísně specifikovaný výstup a jsou obecně považovány za bezpečné v tomto Ve výše uvedeném příkladu ssh-agent spustí proces agenta SSH a odešle několik příkazů, které nastaví příslušné proměnné prostředí, které ssh klient bude později muset použít agenta, například

SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018; 

Toto poté vyhodnotí eval.

eval se zde používá spíše než jen jednoduše pomocí $(ssh-agent), protože výstup příkazu ssh-agent je spíše složený. Bez eval by zakončení příkazu ; byly speciální.

Příklad:

$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world 

Komentáře

  • OTOH, eval "$(dircolors)" je rozumná věc. Stejné jako několik dalších příkazů, které se řídí tímto vzorem, například gpg-agent.
  • @derobert Ano a $(ssh-agent). Dobrá poznámka.

Odpověď

Pomocí set -x můžete podívejte se, co dělá shell:

set -x $(echo "a") ++ echo a + a 

Shell provede echo a a umístí výstup na příkazový řádek. Je to stejné, jako kdybyste se pokusili spustit tento příkazový řádek:

a 

Shell hledá příkaz a v cestě (a ještě předtím v seznamech funkcí, aliasů a hashů) ji nenajde a tím způsobí chybu.

Funguje, pokud je výstup platný příkaz:

$(echo "ls") 

Komentáře

  • můžete mi říct, k čemu vlastně použijeme $ other a potom zavoláme proměnnou.
  • @Ashu Zřejmě se také používá k nahrazení příkazů – váš případ. Kromě toho se objevuje ve výpočtu (echo $((1+2+3))), vytváření řetězců ($'foo\nbar' / $"foo") a (méně související s shellem) v regexech, kterým bash rozumí ([[ foo =~ ^f..$ ]]). Používá se také k úpravě proměnných několika způsoby: ${foo#bar}

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *