Čtení stdin v bash skriptu

romanio

Čtení stdin v bash skriptu
« kdy: 01. 10. 2016, 21:38:05 »
Dobrý večer,
píšu skript, kterému budu předávat jeden z parametrů dvěma různými způsoby: jako poziční parametr a přesměrováním výstupu jiného skriptu.
To by nebyl až tak problém.

$cat stdin.sh
#!/bin/bash
if [ "$1" ]; then var=$1; else var=`cat`; fi
echo '"'$var'"'

$ ./stdin.sh AAA
"AAA"

$ echo BBB | ./stdin.sh
"BBB"

V některých situacích však tento parametr nebude potřeba vůbec.
Můžu to sice obejít takto:

$ echo | ./stdin.sh

nebo přidáním přepínače např.

$ ./stdin.sh --no-param

ale to se mi moc nelíbí.
Napadlo mě, jestli by nebylo možno u čtení stdin nějak jednoduše zjistit, jestli je na něj přesměrován výstup od jinud a číst jej jen pokud ano.
Je to vůbec možné ? Děkuji za radu.



romanio

Re:čtení stdin v bash skriptu
« Odpověď #2 kdy: 02. 10. 2016, 09:12:39 »
Díky moc za nakopnutí, už to funguje dle mých představ:

$ cat stdin.sh
#!/bin/bash
if [ "$1" ]; then
  var=$1
elif [ ! -t 0 ]; then
  var=`cat`
fi
echo '"'$var'"'

$ ./stdin.sh
""test

$ ./stdin.sh A
"A"

$ echo B | ./stdin.sh
"B"


Jen mě trochu mate ta použitá negace. Co jsem našel pro test, tak :
[ -t <fd> ]  -  True, if file descriptor <fd> is open and refers to a terminal.
Z toho bych usuzoval, že při přesměrování vrátí True a ne naopak.




romanio

Re:čtení stdin v bash skriptu
« Odpověď #3 kdy: 02. 10. 2016, 09:20:32 »
Citace$ ./stdin.sh
""test
správně je:

$ ./stdin.sh
""

romanio

Re:čtení stdin v bash skriptu
« Odpověď #4 kdy: 02. 10. 2016, 09:35:36 »
Citace od: romanio kdy 02. 10. 2016, 09:12:39
Jen mě trochu mate ta použitá negace. Co jsem našel pro test, tak :
[ -t <fd> ]  -  True, if file descriptor <fd> is open and refers to a terminal.
Z toho bych usuzoval, že při přesměrování vrátí True a ne naopak.

::) CVAK ! Jasně, že při přesměrování NENÍ stdin připojen na terminál.