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
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ýmbash
rozumí ([[ foo =~ ^f..$ ]]
). Používá se také k úpravě proměnných několika způsoby:${foo#bar}
eval "$(dircolors)"
je rozumná věc. Stejné jako několik dalších příkazů, které se řídí tímto vzorem, například gpg-agent.$(ssh-agent)
. Dobrá poznámka.