Intereting Posts
О взаимосвязи между инициализацией оболочки и настольными приложениями после «графического входа» Использование настраиваемого фильтра через скрипт для отклонения входящей электронной почты Как узнать, работает ли скрипт в Linux или OSX Скопируйте файл и структуру файла и объедините в новый каталог Проблемы с установкой вин в CentOS Остановить доступ пользователя к среде Live CD или восстановлению? Ошибка установки Linux, связанная с файловой системой Wifi внезапно не работает на thinkpad, как в Manjaro, так и в parrot linux копировать файлы по дереву, а копировать файлы, а не каталоги в целевом Правильно ли я понимаю ядра? Minix: Kernel Panic при загрузке с Live CD Почему некоторые программы (например, readlink) не могут вводить данные из канала? Показать параметры команды в командной строке Найдите и установите отсутствующие данные XLFD на основе шрифтов X11 dovecot mysql-connection ошибка из-за специального charater в config

Обработка ввода для команды чтения как самой команды

Допустим, я определил эту функцию в скрипте:

fct1() { local msg1=${@} if [[ "${verb}" = 'tru' ]]; then echo "I say $msg1" sleep 1 echo "i repeat" sleep 1 echo "I saaaaaaaaay $msg1" else echo "$msg1" fi } 

Как бы я мог заставить пользователя вызывать эту функцию из read ?

Я думаю что-то вроде

read fct1 "aha aha ahaaaaa"

И вывод будет:

"I say aha aha ahaaaaa" "I repeat" "I saaaaaaaaay aha aha ahaaaaa"

В основном, как я могу использовать входные данные для read и не сохранять их в переменной, а использовать как команду?

Благодарю.

    Если вы хотите, чтобы сообщение было прочитано как одна строка из stdin (введено пользователем, когда скрипт используется в терминале), а затем передано в качестве аргумента функции, вы можете сделать:

     fct1 "$(line)" 

    line больше не является стандартной командой, но все еще довольно широко распространена. Вы можете заменить его на head -n1 , но в некоторых реализациях он может прочитать более одной строки (хотя выводит только одну), когда ввод не поступает от терминального устройства.

    При read bash вы должны будете хранить его в переменной. Это то, что read для read , хранить входные данные в переменной.

     IFS= read -r line && fct1 "$line" 

    При read zsh вы можете использовать опцию -e которая отображает прочитанные данные, а не сохранять их в переменной, поэтому line выше line можно записать в виде IFS= read -re :

     fct1 "$(IFS= read -re)" 

    (это менее эффективно, чем использование read с переменной, так как нам нужно форкнуть процесс, чтобы zsh мог read выходные данные read ).

    Конечно, вы также можете заменить:

     local msg1=${@} 

    с

     local msg1; IFS= read -r msg1 || return 

    Утилита read не позволяет использовать обратные вызовы (я не уверен, что это делают обычные инструменты Unix). Кроме того, она не выводит данные, которые читаются.

    Что вам нужно сделать, это заключить вызов read в функцию, которая принимает то, что предоставляет пользователь, и выводит его обратно, как вы описали. В качестве альтернативы, используйте другой инструмент для чтения ввода и получения желаемого результата, например, awk .

    Кроме того, в общем случае использование variable=$@ не очень хорошо определено. Если вы хотите, чтобы аргументы командной строки представляли собой список значений, разделенных пробелами, вместо этого используйте variable="$*" (при условии значения по умолчанию для переменной IFS ).

    Это довольно необычный запрос … хммм … для того, чтобы получить какой-то ввод с терминала в список позиционных параметров этой функции, попробуйте

     fct1 "$(cat)" dfergerg I say dfergerg i repeat I saaaaaaaaay dfergerg 

    Это будет продолжаться до тех пор, пока вы не введете EOF (CTRL-D). Убедитесь, что переменная vert установлена ​​в значение tru вне функции.