У меня есть сценарий, в котором вы можете запускать его так же, как это ./myscript, и вывод некоторых команд, вызываемых внутри скрипта, скрыт, как это:
if mvn tomcat:deploy &> /dev/null; then
Но если скрипт выполненный таким образом ./myscript -v, вы можете видеть выходные данные команд, поэтому это будет просто:
if mvn tomcat:deploy; then
Итак, во-первых, каково значение стандартного вывода, поэтому я могу сохранить либо это значение, либо [ f6] в переменной, чтобы сделать вызов следующим образом:
if mvn tomcat:deploy &> $output; then
И что лучше всего проверить аргументы? Нужно ли буквально проверять, что $1 равно буквенному -v, или есть лучший подход (поскольку параметры используются таким образом, я думаю, что существуют разные механизмы)?
Я бы определенно предложил использовать bash's getopts для обработки любых параметров командной строки - есть учебник Small getopts на wiki.bash-hackers.org, который я нашел очень полезным.
Для перенаправления вывода вместо сохранения файлового дескриптора (ов) вы можете просто условно перенаправить поток (ы) перед телом вашего сценария или (возможно, более чисто), просто закройте поток (ы), используя exec n>&-, где n - числовое файловый дескриптор потока (1 = stdout, 2 = stderr).
IMHO было бы более естественно сохранять вывод, когда команда запускается без аргументов, и имеет параметр -q (тихий) dump output to / dev / null - например
#!/bin/bash
while getopts ":q" opt; do
case $opt in
q)
quiet=1
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
if [ "${quiet:-0}" -ne 0 ]; then
exec 1>&- 2>&-
fi
#
# remainder of your script here
#
Если вы уверены, что хотите сделать обратное (например, отправьте stdout и stderr в / dev / null по умолчанию), вы можете перевернуть логика.