Č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.
Kód: [Vybrat]
$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:
Kód: [Vybrat]
$ echo | ./stdin.sh
nebo přidáním přepínače např.
Kód: [Vybrat]
$ ./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.
« Poslední změna: 02. 10. 2016, 21:24:38 od Petr Krčmář »



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:
Kód: [Vybrat]
$ 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
Kód: [Vybrat]
$ ./stdin.sh
""test
správně je:
Kód: [Vybrat]
$ ./stdin.sh
""

romanio

Re:čtení stdin v bash skriptu
« Odpověď #4 kdy: 02. 10. 2016, 09:35:36 »
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.