У меня есть следующий сценарий:
#!/bin/sh
[ "${#}" -eq "0" ] && (printf "%s\\n" "${0}: word ..." >&2; exit 1)
_whats()
{
[ -z "${1}" ] && return 1
[ -z "${2}" ] && more_than_one="1"
for word; do
response="$(dig +short txt ${word}.wp.dg.cx)"
printf "%s\\n" "${response}"
if [ -z "${more_than_one}" ]; then
printf "\\n%s\\n\\n" ":::::::::::::::::::::::::::::::::::::::::"
fi
done
}
_whats "${@}"
Это работает отлично, когда я называю это этим путем:
whats shell\ script dns #it ouputs two definitions (shell script and dns)
Однако я был бы также для вызова этого этим путем:
echo shell\ script dns | whats
Я просто привык к нему, все другие команды Unix могут сделать это, как Вы реализовали бы его в сценарии оболочки?
После чтения следующих ссылок:
Я отредактировал вышеупомянутый сценарий следующим образом:
#!/bin/sh
if [ ! -t 0 ]; then
#there is input comming from pipe or file, add to the end of $@
set -- "${@}" $(cat)
fi
[ "${#}" -eq "0" ] && (printf "%s\\n" "${0}: word ..." >&2; exit 1)
_whats()
{
[ -z "${1}" ] && return 1
[ -z "${2}" ] && more_than_one="1"
for word; do
response="$(dig +short txt ${word}.wp.dg.cx)"
printf "%s\\n" "${response}"
if [ -z "${more_than_one}" ]; then
printf "\\n%s\\n\\n" ":::::::::::::::::::::::::::::::::::::::::"
fi
done
}
_whats "${@}"
Который свяжет args + stdin в $, поэтому теперь он будет работать в следующих сценариях:
whats dns script #it outputs two definitions
echo dns script | whats #same outputs as above
echo dns script | whats ip #outputs ip, dns and script definition in that order
Это проанализирует правильно пробелы с, они стали args
whats shell\ script dns #output two definitions
Но не, когда те параметры передаются через канал:
echo shell\ script dns | whats #output three definitions
Однако это - проблема, которую другие утилиты Unix имеют также (-print0,-0, и т.д.), таким образом, я могу жить с нею.