Как использовать команду «read» в сценарии Shell, который читает аргументы из stdin

330
Lucas

Прежде всего, спасибо за вашу помощь заранее и извините за ответ на этот вопрос ранее. Я не смог найти его.

Чтобы помочь понять мой вопрос, я написал следующий простой скрипт под названием «list_server_owners» (он бесполезен, но это всего лишь пример):

#!/bin/bash  SERVER_LIST="" SERVER_LIST="$(cat) " # This reads from stdin  for SERVER in $SERVER_LIST do echo -n "Please, write the server's owner: " read OWNER echo "$'s owner is $OWNER" done 

У меня есть следующий текстовый файл с именем «server_list»:

Server1 Server2 

И это вывод скрипта, передающего «server_list» через stdin:

$ cat server_list | list_server_owner Please, write the server's owner: Server1's owner is Please, write the server's owner: Server2's owner is 

Проблему легко описать: строка скрипта «ЧИТАЙТЕ ВЛАДЕЛЬЦА» работает не так, как хотелось бы. Имя владельца сервера не запрашивается на экране.

Знаете ли вы, как я могу заставить команду «читать» запросить строку на экране?

-1

3 ответа на вопрос

0
Lucas

Я нашел решение.

Вы должны добавить сделать это:

MY_TTY=$(ps -ef | grep -m 1 $$ | awk '') read OWNER </dev/$ 
0
PBI

Файл / dev / tty является синонимом управляющего терминала процесса, поэтому просто перенаправьте ввод с этого устройства:

... read OWNER </dev/tty ... 

Вы также можете перенаправить вывод приглашения echo до / dev / tty, а затем использовать скрипт в конвейере:

#!/bin/bash  while read SERVER # this reads from stdin do echo -n "Please, write the server's owner: " >/dev/tty read OWNER </dev/tty echo "$SERVER:$OWNER" # write to stdout done 

И используйте как:

 cat server_list | assign_owner > server_owner 
0
user550897

Еще одна возможность, и она для меня самая простая:

exec 0</dev/tty read OWNER 

При этом вам не нужно указывать стандартный ввод для всех команд «чтения» вдоль скрипта.

Я был сбит с толку, потому что, если вы напишите команду «tty» внутри скрипта, то ничего не выйдет, но, как говорится в последнем комментарии (спасибо), распознается специальный файл / dev / tty.

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