Как добавить опцию многословия для управления выводом скрипта? - PullRequest
2 голосов
/ 02 июня 2019

Я пытаюсь добавить опцию «многословия» в свой сценарий для пользователей.
То есть, когда пользователь добавляет -v в качестве аргумента в мой сценарий, сценарий должен выплевывать все, что обычно делает командана stdout.Если нет -v, то на stdout ничего не должно быть напечатано, кроме того, что я echo вручную сообщаю пользователям о выполняющейся команде.

Вот моя идея и реализация -

  1. Иметь переменную V, добавляемую в конце каждой команды в скрипте, -
    , как dd if=/dev/zero of=${XYZ} bs=1M count=5 ${V}
  2. Проверьте параметр -v от пользователя, если он НЕ присутствует, тогда присвойте /dev/null V, иначе V будет нулевым.

Фрагмент скрипта:

V=">/dev/null"
while getopts "v" opt; do
 case $opt in
 v) V="" ;;
 esac
done

dd if=/dev/zero of=${XYZ} bs=1M count=5 ${V}

Итак, я ожидаю, что когда для V установлено значение /dev/null, dd команда не будет печатать что-либо иначе Vв любом случае является нулевым, поэтому команда напечатает обычный материал, который печатает.

Проблема:
Когда я запускаю скрипт, команда dd (или любая другая команда в этом отношении) рассматривает ${V} как аргумент и жалуется на непониманиеit
Creating Disk Image:dd: unrecognized operand ‘>/dev/null’

Что меня больше смущает, так это то, что когда я жёстко кодирую /dev/null в dd команде
dd if=/dev/zero of=${XYZ} bs=1M count=5 >/dev/null, он работает так, как ожидалось (то есть без вывода на печать).

Было бы очень признательно, если бы кто-нибудь смог пролить свет на упомянутое поведение и предложить соответствующее.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 02 июня 2019

Если вы хотите отключить вывод (stdout), запустите:

exec >/dev/null

Если вы хотите отключить некоторые команды, но не другие, сохраните копию стандартного вывода и перенаправьте как хотите:

exec 6>&1         # Save current stdout as file handle 6
exec >/dev/null   # Silence stdout
date              # This command is silenced
exec >&6          # Restore stdout to its original destination
echo Hi           # This command will display

Пример сценария

#!/bin/bash

# Save current stdout as file handle 6 and then set for silence
exec 6>&1
exec >/dev/null

# Process options
while getopts "v" opt; do
 case "$opt" in
 v) exec >&6 ;;
 esac
done

# Generate output
echo "Information out"
0 голосов
/ 03 июня 2019

Я думаю, что проще использовать переменную по-другому и всегда перенаправлять вывод каждой команды в обработчик. Например:

handle_out() {
    $V
}

while getopts "v" opt; do
 case $opt in
 v) V=cat ;;
 esac
done

dd if=/dev/zero of=${XYZ} bs=1M count=5 | handle_out

Обратите внимание, что если опция "v" не указана, то $ V в функции handle_out пусто. Это заставляет handle_out действовать как приемник данных. Если указана опция «v», то handle_out вызывает cat, что просто отправляет вывод в STDOUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...