Prečo dostanem ďalší prázdny riadok, keď beží 2). Pre mňa je 1 rovnaké ako 2. Prečo teda ďalší riadok v 2)?
1)
export p1=$(cd $(dirname $0) && pwd)
# ^
echo p1
2)
export p2=$(cd $(dirname $0)) && pwd
# ^
echo p2
odpovede:
0 pre odpoveď č. 1$echo $0
/bin/bash
$ echo $(cd $(dirname $0) && pwd)
/bin
$ echo $(cd $(dirname $0)) && pwd
/home/user
$
V 1. výraze sa stáva echo $(cd /bin && pwd)
, Preto vnútorné 2 príkazy vykonávajú v podshare a vracajú späť pwd
hodnota, ktorá sa potom opakuje.
V druhom výraze sa zníži na echo $(cd /bin) && pwd
, Preto iba príkaz cd sa vykonáva v podshare a nevracia nič do ozveny (preto v predvolenom nastavení echo iba tlačí prázdny riadok). Pretože odozva úspešne prebehla (výstupný kód = 0) &&
výsledky v skutočnosti a pwd
cmd je spustený v aktuálnom prostredí a pwd
sa vytlačí
0 pre odpoveď č. 2
p1 zachytáva výstup cd
(prázdne) a pwd
.
p2 zachytáva iba výstup cd
a potom beží pwd
bez presmerovania.
echo p1
tlačí literál p1
(s novým riadkom). Myslím, že ste z vášho terminálu skutočne nekopírovali a nelepili, ale namiesto toho ste napísali niečo iné.
peter@tesla:~$ export p2=$(true) && pwd
/home/peter
peter@tesla:~$ echo "x${p2}x"
xx
cd
v subshell nemá vplyv na pwd rodičovského shellu, tak som jednoducho nahradil true
príkaz, aby bol čitateľnejší.