Перенаправление вывода на вывод std или / dev / null в зависимости от дополнительного параметра

У меня есть сценарий, в котором вы можете запускать его так же, как это ./myscript, и вывод некоторых команд, вызываемых внутри скрипта, скрыт, как это:

if mvn tomcat:deploy &> /dev/null; then

Но если скрипт выполненный таким образом ./myscript -v, вы можете видеть выходные данные команд, поэтому это будет просто:

if mvn tomcat:deploy; then

Итак, во-первых, каково значение стандартного вывода, поэтому я могу сохранить либо это значение, либо [ f6] в переменной, чтобы сделать вызов следующим образом:

if mvn tomcat:deploy &> $output; then

И что лучше всего проверить аргументы? Нужно ли буквально проверять, что $1 равно буквенному -v, или есть лучший подход (поскольку параметры используются таким образом, я думаю, что существуют разные механизмы)?

1
задан 1 June 2014 в 20:59

1 ответ

Я бы определенно предложил использовать 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 по умолчанию), вы можете перевернуть логика.

1
ответ дан 24 May 2018 в 07:06

Другие вопросы по тегам:

Похожие вопросы: