/ / Linuxový rozdiel medzi tým, kedy používať zátvorky - linux, bash

Linuxový rozdiel medzi tým, kedy používať zátvorky - linux, bash

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 cda 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ší.