Вы можете прочитать одну строку ввода с помощью sed
и преобразовать разделитель в символы новой строки, например:
% sed 'y/,/\n/;q' /dev/tty
> this,is,a,single,line
##OUTPUT
this
is
a
single
line
Потому что sed
записывает результат в стандартный вывод в виде текстового файла, после чего up с e x
plicit grep
прост и выполняется в одном потоке. Фактически, вы можете использовать sed
как умный tee
, если воспользуетесь его функцией w
rite to file; и, если вы w
обращаетесь к устройствам файловых дескрипторов, вы можете разделить его вывод на основе определенных вами правил.
Функция, которая запрашивает ввод и выводит только разделенный новой строкой список допустимых аргументов для stdout и ошибочный вывод в stderr, может выглядеть так:
_accept_prompt() (
. /dev/fd/0
IFS=${delim-,}
_prompt "$@" >&2
{ _read_split "$@" |
err=all _grep_ok "$@" |
sed '1{$d}' >&2
} 3>&1 | _grep_ok "$@"
) <<\HELPERS
_prompt() {
cat ; printf ' : '
} <<-PROMPT
Choose from : $(printf "'%s' " "$@")
Enter a '$IFS'-delimited selection below...
PROMPT
_read_split() {
y="y/${IFS}/\n/"
sed -ne "H;x;s/^/Invalid input IGNORED:/;${y};p;x" \
-ne "/all/s/.*/$*/;${y};w /dev/fd/3" -ne q
} </dev/tty
_grep_ok() {
grep -${err+v}xF "$(printf '%s\n' "$@" $err)"
}
HELPERS
Я разделил это на , надеюсь, вспомогательные функции с более описательным названием в вместо комментариев и прикрепил их к основной функции. Таким образом, весь поток происходит в первых нескольких строках. Я надеялся прояснить это.
_read_split
выводит два потока - > & 1
и > & 3
. _grep_ok
берет первый с определенным $ err
и записывает в > & 2
все строки, содержащиеся во входных данных, которые не входят в _accept_prompt
' s позиционные параметры.
_grep_ok
одновременно захватывает второй поток - > & 3
и записывает в его > & 1 stdout
все строки на входе, которые являются среди позиционных параметров _accept_prompt
.
Запуск:
% _accept_prompt this is the list of acceptable parameters
###PROMPT
Choose from : 'this' 'is' 'the' 'list' 'of' 'acceptable' 'parameters'
Enter a ','-delimited selection below...
###INPUT
: all,invalid
###STDOUT
this
is
the
list
of
acceptable
parameters
###STDERR
Invalid input IGNORED:
invalid
Вы можете изменить разделитель запятой по умолчанию ,
при вызове, например:
delim=? _accept_prompt $args
Отредактируйте соответствующую строку в /etc/fstab. Это будет вторая колонка, отвечающая за «цель монтирования». Подробности смотрите в man fstab. Это просто.