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

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

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

Но если сценарий выполняется как это ./myscript -v Вы видите вывод команд, таким образом, это было бы справедливо:

if mvn tomcat:deploy; then

Таким образом, сначала, что является значением стандартного вывода, таким образом, я могу сохранить или то значение или /dev/null в переменной для совершения вызова как это:

if mvn tomcat:deploy &> $output; then

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

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

2 ответа

Можно назвать стандартный вывод в оболочке сценария с помощью любого из:

  • 1
  • /dev/stdout
  • /proc/self/fd/1

Все - просто способы сказать "дескриптор файла № 1", который является стандартным предварительно открытым приемником данных для вывода.

(На самом деле, синтаксис перенаправления > просто изменения, которые предварительно открыли fd так, чтобы, когда подкоманда пытается записать в fd 1, он на самом деле перешел к некоторому другому файлу или устройству. >& делает то же к обоим дескрипторам 1=stdout и 2=stderr.)

Если у Вас есть просто один флаг, нет ничего неправильно только с проверкой $1. Существует несколько способов сделать обработку параметра командной строки, но один мощный инструмент getopt. Чтобы познакомиться с этим, запустите путем просмотра /usr/share/doc/util-linux/examples/getopt-parse.bash.

0
ответ дан 7 December 2019 в 16:40

Я определенно предложил бы использовать удар getopts для обработки любых параметров командной строки - существует Маленькое getopts учебное руководство по wiki.bash-hackers.org, который я нашел очень полезным.

Для перенаправления вывода, вместо того, чтобы хранить дескриптор (дескрипторы) файла, можно просто условно перенаправить поток (потоки) перед телом сценария или (возможно более чисто), просто закрыть использование потока (потоков) exec n>&- где n является числовым дескриптором файла потока (1 = stdout, 2 = stderr).

По моему скромному мнению, было бы более естественно сохранить произведенным, когда команда выполняется без аргументов, и имейте a -q (тихая) опция вывести вывод к/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
ответ дан 7 December 2019 в 16:40

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

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