Интеллектуальный скрипт, который может считывать данные из PIPE и аргументы командной строки:
#!/bin/bash
if [[ -p /proc/self/fd/0 ]]
then
PIPE=$(cat -)
echo "PIPE=$PIPE"
fi
echo "ARGS=$@"
Выход:
$ bash test arg1 arg2
ARGS=arg1 arg2
$ echo pipe_data1 | bash test arg1 arg2
PIPE=pipe_data1
ARGS=arg1 arg2
Объяснение: Когда скрипт получает любые данные по каналу, stdin / proc / self / fd / 0 будет символической ссылкой на канал.
/proc/self/fd/0 -> pipe:[155938]
Если нет, он будет указывать на текущий терминал:
/proc/self/fd/0 -> /dev/pts/5
Опция bash if -p
может проверить, что это труба или нет.
cat -
читает из stdin
.
Если мы используем cat -
, когда нет stdin
, он будет ждать вечно, поэтому мы помещаем его в условие if
.