Если эта команда не имеет опции молчания, перенаправить ошибку в /dev/null.
oidvalue=$(snmpget -v 2c -c public localhost 1234 2>/dev/null)
Вы можете написать небольшой скрипт для чтения имен файлов, чтобы работать с файлом.
Пример файла
$ cat /tmp/files.txt
one.txt
two.txt
three.txt
Скрипт
while read -r fileName; do
gawk -f awk_prac.awk $fileName;
done < /tmp/files.txt
Выход:
one.txt
two.txt
three.txt
В аналогичных строках вы также можете получать ввод со стандартного ввода. Вы можете указать одно имя файла в строке или все имена файлов в одной строке и соответственно написать сценарий.
Файл сценария driver.sh
#!/usr/bin/bash
for argument do
gawk -f awk_prac.awk "$argument";
done
Исполнение(можно дать несколько файлов):
$./driver.sh file1.txt file2.txt... [filen.txt]
Если имена файлов должны быть заданы в стандартном вводе , можно использовать цикл for для каждого запускаемого файла:
while read -p "Enter File name : " file
do
gawk -f awk_prac.awk $file
echo "Press Ctrl+C to quit"
done
Казнь :Просто
$./driver.sh
Два решения, в зависимости от того, что вы собираетесь cat text.txt | driver.sh
должно делать (, которое, кстати, лучше записывается какdriver.sh <text.txt
).
text.txt
. text.txt
. Ваш "драйвер" (оболочка, действительно )скрипт может добавить /dev/stdin
в список позиционных параметров, если этот список пуст:
#!/bin/sh
if [ "$#" -eq 0 ]; then
set -- /dev/stdin
fi
gawk -f awk_prac.awk "$@"
Это заставит сценарий awk
получать ввод из стандартного потока ввода, если сценарий-оболочка вызывается без каких-либо аргументов.
Обратите внимание на цитирование "$@"
. Это будет расширяться до каждого позиционного параметра (аргумента сценария оболочки ), заключенного в кавычки по отдельности, что означает, что он будет работать с именами файлов, в именах которых есть пробелы и / или символы оболочки.
Если ваш awk
код ожидает одиночный файл для каждого вызова, используйте цикл:
#!/bin/sh
if [ "$#" -eq 0 ]; then
set -- /dev/stdin
fi
for pathname do
gawk -f awk_prac.awk "$pathname"
done
Если вы под чтением стандартного ввода подразумеваете, что хотите читать имена путей из стандартного ввода (, а не данные для обработки ),тогда вы можете использовать xargs
(, так как количество путей может превышать максимальную длину командной строки, сгенерированной для вызова вас awk
script):
#!/bin/sh
if [ "$#" -eq 0 ]; then
cat
else
printf '%s\n' "$@"
fi | xargs -r gawk -f awk_prac.awk
Это передает имена путей из стандартного ввода напрямую (черезcat
)в xargs
, если сценарию не переданы аргументы. Если есть аргументы, они печатаются в виде списка с разделителями -новой строки для обработки xargs
. Опять же, цитирование "$@"
необходимо.
Параметр -r
для xargs
останавливает выполнение утилиты gawk
, если для нее не предоставлены данные составным оператором if
. Это нестандартная опция -, см. руководство по xargs
.
Если ваш awk
код ожидает одного файла для каждого вызова, используйте xargs
с -L 1
.